data class 一行抵 50 行;object 单例零模板;sealed 类型安全分支建模。
public class User {
private final String id;
private final String name;
private final int age;
public User(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() { return id; }
public String getName() { return name; }
public int getAge() { return age; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age &&
Objects.equals(id, user.id) &&
Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name, age);
}
@Override
public String toString() {
return "User{...}";
}
}
data class User(
val id: String,
val name: String,
val age: Int
)
| 方法 | 说明 |
|---|---|
equals() | 结构相等比较 |
hashCode() | 基于属性算 hash |
toString() | "User(id=u001,...)" |
copy(...) | 不可变更新 |
componentN() | 解构声明 |
实战:用 copy(...) 做"不可变更新" - 函数式编程的核心思想。
data class User(
val id: String,
val name: String,
val age: Int,
val email: String,
)
Kotlin 的 object 关键字一行实现单例,跟 Java 的"私有构造 + static instance"模式等价但更简洁。
class User(name: String)
val u1 = User("a")
val u2 = User("a")
u1 === u2 // false
// 每次都是新对象
object DB {
fun query() = ...
}
DB.query()
DB === DB // true
// 全局唯一的实例
class User {
companion object {
fun create() = ...
}
}
User.create()
// 看起来像 static
| 场景 | 用哪个 | 例子 |
|---|---|---|
| 全局单例(DB / Logger / Config) | object | object Logger { fun log(msg: String) } |
| 静态工厂方法 / 常量 | companion object | User.create("Alice") / User.MAX_LEN |
| 替代匿名内部类 | object 表达式 | val l = object : Listener { ... } |
常用场景:网络请求结果(Loading / Success / Failure)、UI 状态、ADT 建模。
sealed class Result<out T> {
data class Success<T>(val data: T) : Result<T>()
data class Failure(val error: String) : Result<Nothing>()
object Loading : Result<Nothing>()
}
fun handle(r: Result<String>) = when (r) {
is Result.Success -> "✅ ${r.data}"
is Result.Failure -> "❌ ${r.error}"
Result.Loading -> "⏳ 加载中"
// 不需要 else!编译器知道穷尽了
}
| 维度 | enum | sealed class |
|---|---|---|
| 携带数据 | 固定字段 | 每个子类不同结构 |
| 子类位置 | enum 内 | 同文件 / 同模块 |
| when 穷尽 | 支持 | 支持 |
| 典型场景 | 固定枚举值(性别、状态码) | 异质状态(Result / Event / UiState) |