Аргументы по умолчанию 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() {}