java - 从 javabean 创建不可变对象(immutable对象)

标签 java immutability javabeans

我参与了这个项目,我们在其中构建了很多遗留代码。我有一个关于必须通过电线传输的大 java bean 对象的特殊情况。所以我的第一个想法是让它不可变和可序列化来完成这个技巧。在这一点上,我面临着一些艰难的选择:-

  1. 理想情况下,我想要一些方法 自动生成一个不可变的, 此类的可序列化版本。 我没有重构的范围或 以任何方式改变这个类,我 真的很讨厌不得不 复制粘贴类(class) 不同的名字?

  2. 假设我放弃了 1 即我 实际上选择了复制代码 巨大的 javabean 类,我仍然 将处于不利的境地 不得不写一个构造函数 使用大约 20-25 个参数来制作 这个类是不可变的。什么是 使类不可变的更好方法 除了构造函数注入(inject)?

感谢和问候,

最佳答案

要使其真正不可变,您需要在构造时初始化成员。

要做到这一点并避免在构造函数中使用庞大的参数列表,一种方法(我并不是说它很漂亮!)是使用具有相同属性的可变类型。通过“setter”一次设置可变类型的属性,然后将可变对象作为单个参数传递给不可变类型的构造函数。然后不可变对象(immutable对象)将属性从可变源复制到它自己的 (final) 成员。

您还可以考虑“有效不变性”。也就是说,即使系统没有强制执行不变性,您使用的编码实践也将初始化阶段与使用阶段明确分开。毕竟,序列化不需要不变性。

您可以更进一步,为不公开实现属性的接口(interface)创建隐藏实现的包装器。包装器仅通过委托(delegate)给“真实”实现来实现接口(interface)中的方法。实现中的 setter 和 getter 不存在于包装器中。这将阻止客户端简单地从接口(interface)向下转换到实现类并操纵属性。

关于java - 从 javabean 创建不可变对象(immutable对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/753375/

相关文章:

java - Jersey:重定向到 Jersey 根之外

java - C中的 "nonmodifiable"和其他编程语言中的 "immutable"意思一样吗?

java - 如何在 Play 框架的索引页面上加载示例 html 页面?

java - Spring @Required 注解已弃用?

java - 匿名 Spring bean

java - 如何检查java中的空格

java - Hibernate:多对多映射: "Two-way"

java - 您如何评价以下 java 解决方案或者您将如何解决它?

c++ - 如何强制 vector 不可变?

java - 想知道我是否正确地进行了这个不变性练习