📜  如何在 Kotlin 函数中指定默认值?

📅  最后修改于: 2022-05-13 01:55:01.008000             🧑  作者: Mango

如何在 Kotlin 函数中指定默认值?

在 Kotlin 中,您可以为函数定义中的参数提供默认值。如果调用函数时传递了参数,则这些参数将用作参数。但是,如果在没有传递参数的情况下调用函数,则使用默认参数。但是,如果您来自Java世界,您可能会记得我们无法为方法指定默认值。这意味着我们不能在Java中做这样的事情:

public void foo(int a, int b=10) {
}

我们需要为它写两个方法,称为方法重载:

public void foo(int al {
}

public void foo(int a, int b) {
}

另外,假设您有一个函数三种不同类型参数的函数,例如:

public void foo (int a, double b, String c){
}

然后你会有七个方法重载的实例:

public void foo (int a, double b, String c),
public void foo (int a, double b) ,
public void foo (double b, String c) ,
public void foo (int a, String c) ,
public void foo (int a) ,
public void foo (double b) ,
public void foo (String c)

Kotlin 在方法中为您提供了默认值,您可以通过这些默认值来防止大量的方法重载。有些人可能会说,“嘿,我们为什么不使用构建器模式而不是方法重载呢?”。那些人是对的,但 Kotlin 的方式比这更容易。让我们看看如何!

例子

在 Kotlin 中,函数的参数可以有默认值,并且在省略相应参数时使用它们。这反过来又减少了过载的数量。前面带有三种不同类型参数的示例可以在 Kotlin 中用更少的代码轻松解析。让我们在编辑器中添加上述代码,运行它,然后检查输出:

Kotlin
fun main (args: Array){
  foo ()
  foo (1)
  foo (1, 0.1)
  foo (1, 0.1, "custom string")
}
  fun foo (a: Int=0, b: Double =0.0, c:String="some default value") {
    printin ("a=$a ,b=$b ,c = Sc")
}


如果您运行上述代码,您将看到以下输出:

输出:

a-0 , b-0.0 ,c - some default value
a=1 , b=0.0 ,c = some default value
a=1 , b=0.1 ,c = some default value
a=1 , b=0.1 ,c = custom string

如您所见,我们不必实现四种不同的方法,我们可以映射参数。当我们不通过提供显式参数来调用方法时使用默认参数,因此当您不传递任何参数时,它只是使用所有默认参数。在命名参数的帮助下,我们可以进一步减少方法的数量,但我们将在下一个秘籍中介绍这一点。需要注意的一件事是默认参数也适用于构造函数。所以你可以有一个类声明如下:

data class Event (var eventName: String? - "", var eventSchedule: 
Date? - Date () , var isPrivate: Boolean - false)

然后我们就可以声明对象了,如图:

Event ("Celebration" )
Event ("Ceberation", Date () )
Event ("Ceberation", Date () , true)

如您所见,在构造函数中的默认值的帮助下,我们避免了实现多个构造函数的需要,而这在Java中是曾经做过的。请记住,这里有一个问题。如果您在Java中创建对象,我们将无法做到这一点。这意味着Java不会接受如下代码所示的行为。现在我知道你会说“与Java的 100% 互操作性发生了什么?!”:

new Event ("Celebration")
new Event ("Celebration", Date () )
new Event ("Celebration", Date () , true)

如果我们想向Java调用者公开多个重载,我们只需要做一个小修改,即将@JvmOverloads 添加到构造函数并使用默认值,以便前面的类声明变为:

data class Event @JvmOverloads constructor (var eventName: String? 
= "", var date: Date? - Date (), var isPrivate; Boolean = false)

另外,我们的方法变成了这样:

@JvmOverloads fun foo (a: Int=0, b: Double =0.0, c: String="some default value" ) {
printin ("a=$a , b=$b ,c = $c")

这是一个很小的代价,但@JvmOverloads注释帮助我们的构造函数和函数具有默认值,也可以从Java世界调用。

如果我们希望我们的代码仅在 Kotlin 世界中工作,那么我们不需要 @JvmOverloads 注释,因为 Kotlin 有自己的规则,它可以使用构造函数和函数中的默认值。添加 @JvmOverloads 注释会创建所有必要的重载。因此,如果您反编译 Kotlin 字节码,您将看到构造函数和函数的所有重载版本。