我参与了这个项目,我们正在构建大量的遗留代码.我有一个关于一个大的java bean对象的特殊情况,它必须通过线路传输.所以我的第一个想法就是让它变得不可变和可序列化.这点我面临一些困难的选择: -
理想情况下,我想要一些方法来自动生成此类的不可变,可序列化版本.我没有以任何方式重构或改变这个类的范围,我真的很讨厌必须复制粘贴具有不同名称的类?
假设我放弃了1即我实际上选择复制巨大的javabean类的代码,我仍然会处于一个令人讨厌的情况,即必须编写一个带有20-25个参数的构造函数才能使这个类不可变.除了构造函数注入之外,什么是使类不可变的更好方法?
感谢致敬,
为了使其真正不可变,您需要在构造时初始化成员。
实现此目的并避免构造函数中出现巨大参数列表的一种方法(我并不是说它很漂亮!)是拥有一个具有相同属性的可变类型。通过“setter”一次设置一个可变类型的属性,然后将可变对象作为单个参数传递给不可变类型的构造函数。然后,不可变对象将属性从可变源复制到它自己的 ( final
) 成员。
您可能还考虑“有效的不变性”。也就是说,即使系统不强制执行不变性,您也可以使用将初始化阶段与使用阶段明确分开的编码实践。毕竟,序列化不需要不变性。
您可以更进一步,为不公开实现属性的接口创建一个实现隐藏包装器。包装器仅通过委托给“真实”实现来实现接口中的方法。实现中的 setter 和 getter 不存在于包装器中。这将阻止客户端简单地从接口向下转换为实现类并操作属性。
归档时间: |
|
查看次数: |
4066 次 |
最近记录: |