我参与了这个项目,我们在其中构建了很多遗留代码。我有一个关于必须通过电线传输的大 java bean 对象的特殊情况。所以我的第一个想法是让它不可变和可序列化来完成这个技巧。在这一点上,我面临着一些艰难的选择:-
理想情况下,我想要一些方法 自动生成一个不可变的, 此类的可序列化版本。 我没有重构的范围或 以任何方式改变这个类,我 真的很讨厌不得不 复制粘贴类(class) 不同的名字?
假设我放弃了 1 即我 实际上选择了复制代码 巨大的 javabean 类,我仍然 将处于不利的境地 不得不写一个构造函数 使用大约 20-25 个参数来制作 这个类是不可变的。什么是 使类不可变的更好方法 除了构造函数注入(inject)?
感谢和问候,
最佳答案
要使其真正不可变,您需要在构造时初始化成员。
要做到这一点并避免在构造函数中使用庞大的参数列表,一种方法(我并不是说它很漂亮!)是使用具有相同属性的可变类型。通过“setter”一次设置可变类型的属性,然后将可变对象作为单个参数传递给不可变类型的构造函数。然后不可变对象(immutable对象)将属性从可变源复制到它自己的 (final
) 成员。
您还可以考虑“有效不变性”。也就是说,即使系统没有强制执行不变性,您使用的编码实践也将初始化阶段与使用阶段明确分开。毕竟,序列化不需要不变性。
您可以更进一步,为不公开实现属性的接口(interface)创建隐藏实现的包装器。包装器仅通过委托(delegate)给“真实”实现来实现接口(interface)中的方法。实现中的 setter 和 getter 不存在于包装器中。这将阻止客户端简单地从接口(interface)向下转换到实现类并操纵属性。
关于java - 从 javabean 创建不可变对象(immutable对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/753375/