首页 > 解决方案 > 是否允许在构造时修改值对象的值

问题描述

假设我希望下面的值对象包含始终大写的字符串值。在构造函数中是否有资格这样做toUpperCase()

class CapitalizedId(value: String) {
    val value: String = value.toUpperCase()
    // getters
    // equals and hashCode
}

标签: domain-driven-designvalue-objects

解决方案


一般来说,我认为在值对象的构造函数中执行如此简单的转换不会有问题。当然,构造函数的用户应该不会感到意外,但正如CapitalizedId这个名字已经告诉你,无论创建什么都会被大写,从我的角度来看,这并不奇怪。我还在构造函数中执行有效性检查,以确保遵守业务不变量。

如果您担心不在构造函数中执行操作,或者操作和验证变得过于复杂,您总是可以提供包含所有繁重工作的工厂方法(或者在 Kotlin 中使用伴侣,我猜,不是 Kotlin 专家)(想想LocalDateTime.of())和验证逻辑,并以某种方式使用它:

CapitalizedId.of("abc5464g"); 

注意:在实现工厂方法时,在这种情况下,构造函数应该是私有的


推荐阅读