Аргументы по умолчанию Kotlin: запретить вызовы с нулевыми аргументами

В моем проекте у меня есть такая функция:

fun doCoolStuff(arg1: Int = 0, arg2: String? = null) { } 

Который я хочу, чтобы он использовал его в следующих случаях:

 obj.doCoolStuff(101) // only first argument provided obj.doCoolStuff("102") // only second argument provided obj.doCoolStuff(103, "104") // both arguments provided 

Но не в этом:

 obj.doCoolStuff() // illegal case, should not be able to call the function like this 

Как достичь этого на уровне синтаксиса?

В Котлине нет синтаксиса, который позволит вам выполнить то, что вам нужно. Используйте перегруженные функции (я бы использовал два, по одному для каждого требуемого аргумента):

 fun doCoolStuff(arg1: Int, arg2: String? = null) { ... } fun doCoolStuff(arg2: String?) { doCoolStuff(defaultIntValue(), arg2) } 

Это невозможно, потому что вы сделали оба аргумента опционными. Вы можете добавить проверку в тело метода или, что бы я предпочел, обеспечить надлежащие перегрузки :

 fun doCoolStuff(arg1: Int) { doCoolStuff(arg1, null) } fun doCoolStuff(arg2: String?) { doCoolStuff(0, arg2) } fun doCoolStuff(arg1: Int, arg2: String?) {} 

Может быть, я не понимаю, но это работает для меня

 fun doCoolStuff() { throw IllegalArgumentException("Can't do this") } 

Просто определите метод без параметров и исключите исключение.

Вы можете объявить doCoolStuff() с нулевым параметром и пометить его как устаревшее с помощью параметра DeprecationLevel.ERROR .

 fun doCoolStuff(arg1: Int = 0, arg2: String? = null) {} @Deprecated("Should be called with at least one parameter", level = DeprecationLevel.ERROR) fun doCoolStuff() {} 
Intereting Posts
В чем причина «неразрешенной ссылки» при использовании kotlin для FacebookLogin? Android Kotlin – Как настроить методы настройки Java-конструктора Что такое объект-компаньон и зачем он нам нужен? Обратный экземпляр enum непосредственно без класса в Котлине Kotlin – Список сортировки с использованием форматированной строки даты (функциональной) Kotlin Reflection – проверка наличия свойства Как установить значение null для параметров функции в kotlin Только готовые коллекции Джексона Переопределение «writeToParcel» не допускается. Вместо этого используйте компаньон «Parceler» Котлин строит, вызывая JVM к ошибке сегментации Spring & kotlin: В чем разница между инсталляцией конструктора и латинита? Как получить и найти текущее состояние на машине состояния Spring? Могу ли я использовать имя лямбда в качестве параметра, переданного «вне круглых скобок»? Получение экземпляра подкомпонента в действие Android: Как сделать преобразователи типов (для комнаты) универсальными для всех Список объектов в Котлине