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 设计并降低维护成本。

相关推荐
事圆则缓3 小时前
Kotlin 类型与空安全:从接口数据到页面状态
kotlin
墨天梦15 小时前
D19_系统分享与文件URI
gitee·kotlin
应用市场20 小时前
离线小游戏做“每日挑战”:日期当随机种子,整局存成 JSON,再加一个“我不是机器人”
android·kotlin·游戏开发
hai_android1 天前
LiveEventBusCore 跨 Activity 通讯源码解析
android·kotlin·android jetpack
维克兜率天1 天前
【维克】统计套利建模:从因子到信号的完整流程
android·开发语言·python·算法·kotlin
释厄6232 天前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
程序猿追2 天前
立方体转到九十度:用 kotlin-math 核对鸿蒙上的两种旋转
android·开发语言·kotlin
程序猿追3 天前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
应用市场3 天前
不用一张图片的像素小游戏:小人是字符串,房间是矩形,平衡靠两千个假玩家
android·kotlin·游戏开发