Kotlin基础篇之 ‌默认参数

Kotlin 的 ‌默认参数(Default Arguments) ‌ 允许在函数定义时为参数指定默认值,从而简化函数调用,减少重载函数的冗余代码

1、基本语法

在函数参数后使用 = 默认值 定义默认参数:

kotlin 复制代码
kotlinCopy Code
fun greet(name: String = "Guest", age: Int = 18) {
    println("Hello, $name! You are $age years old.")
}

2、调用方式

2.1. ‌省略有默认值的参数

调用时可省略已定义默认值的参数:

scss 复制代码
kotlinCopy Code
greet()                  // 输出:Hello, Guest! You are 18 years old.
greet("Alice")           // 输出:Hello, Alice! You are 18 years old.
greet("Bob", 25)         // 输出:Hello, Bob! You are 25 years old.

//greet(25) 不能这样写,只默认首个,可以
greet(age = 25)

2.2 ‌命名参数指定特定参数

通过命名参数跳过中间有默认值的参数:

scss 复制代码
greet(age = 20)          // 输出:Hello, Guest! You are 20 years old.
greet(age = 30, name = "Charlie") // 输出:Hello, Charlie! You are 30 years old.

3、规则与限制

3.1. ‌参数顺序

  • 默认参数可以定义在参数列表的任意位置,但需遵循以下规则:

    • 调用时若省略某个参数,其后的所有参数必须通过命名指定‌。
    • 推荐将默认参数放在参数列表末尾‌,以简化调用。

示例‌:

kotlin 复制代码
kotlinCopy Code
// 默认参数在前(需谨慎)
fun connect(
    timeout: Int = 5000,
    retries: Int,
    url: String = "https://default.com"
) { /* ... */ }

// 正确调用方式
connect(retries = 3)                   // timeout=5000, url=默认值
connect(timeout = 2000, retries = 5)   // url=默认值

3.2. ‌默认值类型

  • 默认值可以是常量、表达式或函数调用:
kotlin 复制代码
kotlinCopy Code
fun calculate(
    a: Int = 10,
    b: Int = (1..10).random()  // 每次调用生成随机默认值
) { /* ... */ }

3.3. ‌与构造函数结合

构造函数也支持默认参数:

ini 复制代码
kotlinCopy Code
class User(
    val name: String = "Anonymous",
    val role: String = "Guest"
)

val user1 = User()                  // name="Anonymous", role="Guest"
val user2 = User(role = "Admin")    // name="Anonymous", role="Admin"

4、最佳实践

4.1. ‌优先将默认参数放在末尾 ‌:

避免调用时强制使用命名参数,提高代码可读性。

4.2. ‌避免过多默认参数 ‌:

若参数过多(如超过 4 个),考虑使用 Builder 模式或数据类封装参数。

4.3. ‌明确命名参数 ‌:

当需要跳过中间参数时,使用命名参数消除歧义:

scss 复制代码
```
kotlinCopy Code
// 不推荐:容易混淆参数顺序
sendMessage("Hello", 5000) 

// 推荐:明确指定参数名
sendMessage(message = "Hello", timeout = 5000)
```

4.4. ‌注意默认值的副作用 ‌:

默认值在每次函数调用时重新计算:

kotlin 复制代码
```
kotlinCopy Code
fun logEvent(event: String, timestamp: Long = System.currentTimeMillis()) {
    println("[$timestamp] $event")
}
// 每次调用 timestamp 都会更新
```

5、示例场景

5.1 ‌配置函数

简化可选配置项的传递:

kotlin 复制代码
kotlinCopy Code
fun createRequest(
    method: String = "GET",
    headers: Map<String, String> = emptyMap(),
    body: String? = null
) { /* ... */ }

// 调用
createRequest()                          // 默认 GET 请求
createRequest("POST", body = "data")    // 指定部分参数

5.2 ‌工具函数

减少重复代码:

kotlin 复制代码
kotlinCopy Code
fun formatText(
    text: String,
    maxLength: Int = 100,
    ellipsis: String = "..."
): String {
    return if (text.length > maxLength) 
        text.take(maxLength) + ellipsis 
    else text
}

// 调用
formatText("A very long text here")      // 默认截断到100字符并添加...
formatText("Short", maxLength = 50)      // 自定义截断长度

总结

Kotlin 的默认参数通过以下方式提升代码质量:

  • 减少重载函数‌:避免编写多个相同逻辑的函数。
  • 增强灵活性‌:支持选择性覆盖参数。
  • 提高可读性‌:命名参数使调用意图更明确。

合理使用默认参数,可以显著简化 API 设计并降低维护成本。

相关推荐
Monkey-旭18 小时前
Android Bitmap 完全指南:从基础到高级优化
android·java·人工智能·计算机视觉·kotlin·位图·bitmap
Monkey-旭1 天前
深入理解 Kotlin Flow:异步数据流处理的艺术
android·开发语言·kotlin·响应式编程·flow
程序员江同学3 天前
Kotlin 技术月报 | 2025 年 7 月
android·kotlin
_frank2223 天前
kotlin使用mybatis plus lambdaQuery报错
开发语言·kotlin·mybatis
Bryce李小白3 天前
Kotlin实现Retrofit风格的网络请求封装
网络·kotlin·retrofit
ZhuYuxi3333 天前
【Kotlin】const 修饰的编译期常量
android·开发语言·kotlin
jzlhll1233 天前
kotlin StateFlow的两个问题和使用场景探讨
kotlin·stateflow
Bryce李小白3 天前
Kotlin 实现 MVVM 架构设计总结
android·开发语言·kotlin
Kiri霧3 天前
Kotlin位运算
android·开发语言·kotlin
xjdkxnhcoskxbco3 天前
kotlin基础【3】
android·开发语言·kotlin