Java 上的可变不可变类模式取决于包

Mutable-immutable class pattern on Java depending on package

提问人:Ernestorumo 提问时间:2/22/2022 更新时间:2/22/2022 访问量:133

问:

java 中是否有任何模式可以使类在包内可变而在包外不可变?

爪哇岛 春天 设计模式 不变性 可变

评论

2赞 Joachim Sauer 2/22/2022
请注意,不可变对象的一些好处来自于它们是绝对不可变的,您将失去它们。作为替代方案,您可以拥有具有公共(完全不可变)实现的单个接口和包私有不可变实现。
0赞 Darkman 2/22/2022
这是对可变/不可变概念的误解。它与访问修饰符无关。这一切都与该类的实现有关。偶数,并且具有不可变的缓冲区,该缓冲区将在需要时调整自身大小。这两个类是不可变的吗?添加关键字是否使它们不可变?没有可变吗?ArrayListStringBuilderfinalStringfinal

答:

2赞 Aasmund Eldhuset 2/22/2022 #1

只需避免在所有字段和修改字段的方法上使用任何访问修饰符,例如 或。没有访问修饰符的字段/方法是 package-private,这意味着它只能由驻留在同一个包中的代码看到。String secret;void setSecret(String secret) { ... }

然而,正如@JoachimSauer和@Darkman所指出的,这样的类实际上并不是不可变的。不可变意味着实例在构建后永远不会更改(无论由谁)。该类将被简单地封装:只有代码库的有限部分(定义该类的包)可以修改该类的实例。