您经常阅读有关不可变对象的信息,这些对象要求最终字段在Java中不可变.实际上是这种情况,还是仅仅是没有公开可变性而实际上没有改变状态?
例如,如果你有一个由构建器模式构建的不可变对象,你可以通过让构建器在构建时分配各个字段,或让构建器自己保存字段并最终通过将值传递给返回不可变对象来实现.它的(私有)构造函数.
使字段最终具有防止实现错误的明显优势(例如允许代码保留对构建器的引用和多次"构建"对象,而实际上是在改变现有对象),但让Builder将其数据存储在构建的对象似乎是DRYer.
所以问题是:假设Builder没有提前泄漏Object并且一旦构建就停止修改对象(例如通过将其对象的引用设置为null),实际上在""中获得了任何改进(例如改进的线程安全性)如果对象的字段是最终的,那么对象的不变性?
是的,你确实从final字段获得"线程安全" .也就是说,final在构造期间分配给字段的值保证对所有线程可见.线程安全的另一个替代方法是声明字段volatile,但随后每次读取都会产生很高的开销......并且会让看到你的类的人感到困惑,并想知道为什么这个"不可变"类的字段被标记为"volatile".
在final技术上标记字段是最正确的,并且最清楚地传达您的意图.不幸的是,它确实使构建器模式非常麻烦.我认为应该可以创建一个注释处理器来合成一个不可变类的构建器,就像Project Lombok对setter和getter一样.真正的工作是需要IDE支持,以便您可以对不存在的构建器进行编码.
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |