方案
为了解决JVM生态目前对复杂不可变对象二次"修改" (基于另一个不可变对象创建新的不可变对象) 不便的问题,诞生了一些不可变对象框架
Jimmer是一个ORM框架,而处理深层次数据结构是ORM的核心问题,所以,Jimmer必须完成类似的工作。
Jimmer需要同时为Java和Kotlin提供优雅的双语支持,上述所有方案都无法达到这个要求,因此Jimmer并未使用它们中的任何一个,而是选择移植JavaScript/TypeScript领域的immer。
接下来,我们会用三个步骤展示移植自immer的不可变对象的强大。
-
定义不可变类型
-
从头创建一个不可变数据结构
-
基于已有的数据结构,按照一些修改愿望,创建新的不可变数据结构。
最后这步是immer核心价值所在,请注意观察。
1. 定义不可变类型
演示此功能无需ORM实体的@Entity
注解,非ORM的@Immutable
足够。
- Java
- Kotlin
TreeNode.java
package yourpackage;
import java.util.List;
import org.babyfish.jimmer.Immutable;
@Immutable
public interface TreeNode {
String name();
List<TreeNode> childNodes();
}
TreeNode.kt
package yourpackage
import org.babyfish.jimmer.Immutable
@Immutable
interface TreeNode {
val name: String
val childNodes: List<TreeNode>
}