Syntax Kotlin默认参数:禁止零参数调用

Syntax Kotlin默认参数:禁止零参数调用,syntax,kotlin,Syntax,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 provi

在我的项目中,我有这样一个功能:

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

如何在语法级别上实现这一点?

Kotlin中没有语法可以让您完成所需的任务。使用重载函数(我会使用两个,每个必需参数一个):


这是不可能的,因为两个参数都是可选的。您可以在方法体中添加一个检查,或者,我更喜欢的是,提供适当的重载:

fun doCoolStuff(arg1: Int) {
    doCoolStuff(arg1, null)
}

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

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

您可以使用零参数声明
doCoolStuff()
,并将其标记为不推荐使用


也许我不明白,但这对我很有用

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

只需定义不带参数的方法并抛出异常。

再想一想,我是否应该创建一组重载函数(实际上是三个)加上一个私有函数,它实际上可以做一些很酷的事情?我希望kotlin中有更简洁的内容。您可以在方法内部检查是否同时设置了这两个参数,但是在什么情况下不能同时使用默认值?反过来说,函数不应该在没有参数的情况下调用。我现在的做法是,在没有提供参数的情况下抛出异常。对不起,用Deprecated声明新方法的想法对我没有吸引力:)另一方面,它会在Android Studio中添加一个很好的自我解释警告…@AlexeyGorovoy它会产生编译时错误而不是简单的警告。我有一个案例,当我需要使用提供的两个参数调用函数时,我想这不能用两个函数来完成?它可以工作。。。但是它不太容易看。我必须停下来仔细阅读它,以了解它提供了所有3个变量(仅限int,int&string=>重载1;仅限string=>重载2)。这只会发生在运行时,这是不好的。像s1m0nw1那样做会在编译时产生错误。我认为这种方法是否“糟糕”——这可能取决于调用函数的上下文。无论如何,我现在使用这种方法,并发布了这个问题,以试图找到更好的解决方案。如果第三个重载的字符串参数的默认值为null,则可以删除第一个重载。。。虽然我认为你的代码更容易阅读。
fun doCoolStuff(arg1: Int = 0, arg2: String? = null) {}

@Deprecated("Should be called with at least one parameter", level = DeprecationLevel.ERROR)
fun doCoolStuff() {}
fun doCoolStuff() {
    throw IllegalArgumentException("Can't do this")
}