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

相关推荐
FunnySaltyFish1 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
Kapaseker7 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
A0微声z3 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton4 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream4 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam4 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker4 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin
糖猫猫cc5 天前
Kite:两种方式实现动态表名
java·kotlin·orm·kite
如此风景5 天前
kotlin协程学习小计
android·kotlin