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

相关推荐
人生游戏牛马NPC1号5 小时前
学习Android(四)
android·kotlin
百锦再5 小时前
Kotlin学习基础知识大全(上)
android·xml·学习·微信·kotlin·studio·mobile
louisgeek6 小时前
Kotlin 协程 launch 和 async 的区别
kotlin
张可8 小时前
历时两年半开发,Fread 项目现在决定开源,基于 Kotlin Multiplatform 和 Compose Multiplatform 实现
android·前端·kotlin
xiangxiongfly91511 小时前
Kotlin 边界限制
kotlin·coercein
百锦再16 小时前
Java与Kotlin在Android开发中的全面对比分析
android·java·google·kotlin·app·效率·趋势
喵手1 天前
从 Java 到 Kotlin:在现有项目中迁移的最佳实践!
java·python·kotlin
居然是阿宋1 天前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
wangz761 天前
kotlin的kmp编程中遇到Unresolved reference ‘java‘问题
kotlin·kmp
投笔丶从戎1 天前
Kotlin Multiplatform--01:项目结构基础
android·开发语言·kotlin