Аргументы по умолчанию 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
Второй экземпляр приложения создается с Android 7.0. Как я могу избежать этого? Получить имя функции в Kotlin Гуава конфликтует при использовании kotlin-script-util (для поддержки JSR-223) в приложении, использующем gRPC Kotlin Kapt не показывает ошибки привязки данных при работе с Android Studio Kotlin Hibernate OneToOne fetchtype.LAZY немедленно запускает все запросы Kotlin view object полное имя типа в студии Android в Mac OS Преобразование наблюдаемого в текущее с противодавлением в RxJava2 Почему Guice не находит привязку List <Interface>? Как сравнить два массива в Котлине? Расширение Котлина для следующего значения Enum без отражения Настройка Gradle с Kotlin Как передать список в качестве параметризованного параметра тестирования JUnit5? Класс данных Kotlin: почему toString () экспортирует закрытые свойства Как заменить Doko-Inko, уи-трюк с функциями kotlin 1.1.0 kotlinx-coroutines-core lib? Быстрый способ инициализации дочернего класса Kotlin с свойствами экземпляра родительского класса