在Android开发中,Kotlin以其简洁的语法和强大的特性显著提升了开发效率。本文将解析Kotlin中7个关键特性,通过代码示例展示它们在实际开发中的应用。
class User constructor(_name: String) { // 传统写法
val name = _name
}
class Student(val id: Int, var name: String) // 简化版
主构造函数直接声明在类名后,使用val/var
声明参数可自动创建属性
class Person(val name: String) {
constructor(name: String, age: Int) : this(name) {
println("Secondary constructor: $name, $age")
}
}
次构造函数必须委托主构造函数,适用于需要多种初始化方式的场景
data class Book(val id: Int, val title: String, var price: Double)
自动生成功能:
• equals()
/hashCode()
• toString()
格式:Book(id=1, title=Kotlin Guide, price=39.9)
• copy()
方法实现对象浅拷贝
• 组件函数componentN()
支持解构
大多数情况下,自动生成的equals() / hashCode()都是可靠的。
类体中定义额外属性
object NetworkManager {
private const val TIMEOUT = 5000
fun makeRequest(url: String) {
println("Requesting $url with timeout $TIMEOUT")
}
}
// 使用
NetworkManager.makeRequest("https://api.example.com")
替代Java静态方法的最佳实践,初始化时机在首次访问时(线程安全)
class DatabaseClient {
companion object {
const val VERSION = "1.2.3"
fun create(): DatabaseClient = DatabaseClient()
}
}
// 调用
val client = DatabaseClient.create()
println(DatabaseClient.VERSION)
伴生对象成员可通过类名直接访问,支持实现接口和扩展函数
open class Animal(val name: String) {
open fun makeSound() = "Generic animal sound"
}
class Dog(name: String) : Animal(name) {
override fun makeSound() = "Woof!"
}
interface Swimmer {
fun swim() {
println("Default swimming implementation")
}
}
关键点:
• 类/方法默认final
,需open
允许继承
• override
强制要求显式声明重写
• 接口支持默认方法实现
class Temperature {
var celsius = 0.0
var fahrenheit
get() = celsius * 9/5 + 32
set(value) {
celsius = (value - 32) * 5/9
}
}
val temp = Temperature()
temp.fahrenheit = 68.0
println("${temp.celsius}°C") // 输出20.0°C
通过自定义getter/setter实现:
• 数据格式转换
• 输入有效性验证
• 延迟初始化
• 访问日志记录
密封类(Sealed Class)
sealed class Result<out T> {
data class Success<T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
object Loading : Result<Nothing>()
}
fun handleResult(result: Result<Int>) = when(result) {
is Result.Success -> println(result.data)
is Result.Error -> println(result.exception)
Result.Loading -> println("Loading...")
}
优势对比枚举
注意事项