使用场景
领域建模
使用场景 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。
建模领域
值类在领域建模中尤其有用。它们可以将没有明确含义的基本类型转换为有意义且不易出错的类型,同时不会产生运行时开销。
下面让我们一起了解一些现实场景。
类型化标识符
独立的 ID 类型可以防止在需要订单 ID 的地方传入用户 ID——这是一个常见且代价高昂的错误。
@JvmInline
value class UserId(val value: Long)
@JvmInline
value class OrderId(val value: Long)
fun fetchUser(id: UserId) = "user " + id.value
fun main() {
println(fetchUser(UserId(7)))
}度量单位
使用单位类型包装数字,可以防止您误把米与秒相加,同时明确记录这些数字的含义。
@JvmInline
value class Kilograms(val value: Double)
fun describe(weight: Kilograms) = weight.value.toString() + " kg"
fun main() {
println(describe(Kilograms(72.5)))
}经过验证的字符串
将值类与 init 块结合使用,可以确保电子邮件地址不为空白等不变量始终成立。
@JvmInline
value class Email(val value: String) {
init {
require(value.contains("@")) { "invalid email" }
}
}
fun main() {
println(Email("a@b.com").value)
}带有行为的货币
以最小货币单位表示金额并添加相关操作,可以避免浮点数导致的货币计算错误。
@JvmInline
value class Cents(val value: Long) {
operator fun plus(other: Cents) = Cents(value + other.value)
fun format() = "$" + value / 100.0
}
fun main() {
val total = Cents(1500) + Cents(250)
println(total.format())
}自描述的 API
使用值类的函数签名,比使用三个没有类型约束的整数清晰得多。
@JvmInline
value class Width(val px: Int)
@JvmInline
value class Height(val px: Int)
fun area(w: Width, h: Height) = w.px * h.px
fun main() {
println(area(Width(4), Height(5)))
}包装敏感数据
值类可以重写 toString,在日志中隐藏机密信息,同时仍然可以访问原始值。
@JvmInline
value class Token(val value: String) {
override fun toString() = "Token(***)"
}
fun main() {
val t = Token("abc123")
println(t) // masked
println(t.value) // real value when needed
}强制执行范围
使用值类将范围规则封装在一个地方,这样任何地方都无法构造出无效状态。
@JvmInline
value class Rating(val stars: Int) {
init {
require(stars in 1..5) { "stars must be 1..5" }
}
}
fun main() {
println(Rating(4).stars)
}智能构造函数
将值类与一个在输入无效时返回 null 的伴生工厂结合使用,可以避免为预期失败抛出异常。
@JvmInline
value class Age(val value: Int) {
companion object {
fun of(n: Int): Age? = if (n in 0..150) Age(n) else null
}
}
fun main() {
println(Age.of(30)?.value)
println(Age.of(-5))
}模式总结
常见的值类模式包括:
- 使用类型化 ID 防止混淆
- 使用度量单位
- 使用
init验证基本类型 - 通过运算符实现领域操作
- 隐藏敏感值
低成本的安全性
由于值类通常会被内联,您可以用几乎为零的运行时开销获得清晰的领域含义和安全性。值类是一种低成本的方式,可以让非法状态无法表示。
快速检查
请检验您对值类应用场景的理解。
回顾
您了解了值类的实际应用场景:
- 类型化 ID、度量单位和经过验证的字符串
- 货币和领域操作
- 隐藏机密信息和使用智能构造函数
下一步:值类的限制。
常见问题解答
「使用场景」课时是免费的吗?
是的 — 「使用场景」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。
「使用场景」这节课中我会学到什么?
领域建模 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kotlin Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用场景」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kotlin Academy 课中编写并运行代码吗?
能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。