Kotlin 中的默认参数允许在函数签名中直接指定默认值,使代码更加简洁和灵活。这种可能性提高了可读性,减少了创建具有不同参数数量的重载方法的必要性,从而简化了维护工作。
在 Java 中,通常需要为函数的不同调用变体编写多个重载方法。Kotlin 开发了一种简洁的方式来声明默认值,从而简化了 API。
为不同调用变体进行方法重载复杂且不方便,导致冗余代码和潜在的支持错误。
Kotlin 允许在函数定义中直接声明默认参数。这通过字节码中的合成伴侣方法(如果从 Java 调用)或通过常规值传递(来自 Kotlin)来实现。结合命名参数,这使得函数调用接口非常强大。
fun greet(name: String = "Guest", greeting: String = "Hello") { println("$greeting, $name!") } greet() // Hello, Guest! greet("Alice") // Hello, Alice! greet(greeting = "Hi") // Hi, Guest! greet("Bob", greeting = "Welcome") // Welcome, Bob!
可以在接口内的函数中使用默认参数吗?
可以,但此时默认值仅在 Kotlin 调用时实现,从 Java 调用时需要明确指定参数。
可以为首个(左侧)参数指定默认参数,而不仅限于最后一个吗?
可以,在 Kotlin 中这是可能的,尤其是当调用时使用命名参数时。然而,从 Java 调用时可能会遇到困难,因为 Java 不支持命名参数,默认参数必须放在右侧。
在混合使用位置参数和命名参数时,参数顺序如何工作?
在 Kotlin 中,第一个命名参数之后,所有后续参数都必须是命名的,否则会产生编译错误。
greet("Ivan", greeting = "Zdrastvuyte") // OK greet(greeting = "Zdrastvuyte", "Ivan") // 错误:不能在命名参数后传递位置参数
在日志库中实现了 10 个重载方法以处理不同的日志组合(带异常、带标签、不带等),维护起来不方便。
优点:
缺点:
使用具有默认参数的函数:
fun log(msg: String, tag: String = "", throwable: Throwable? = null) { ... }
优点:
缺点: