【问题标题】:How to define an immutable object in a mutable Java class?如何在可变 Java 类中定义不可变对象?
【发布时间】:2016-06-18 15:15:32
【问题描述】:

在一个类中,我想定义一个空对象并在我们需要的任何地方使用它。该对象需要是不可变的,以避免意外修改。如果此对象被定义为类的public static final 成员,则如果类本身是可变的,则可以更改该对象。

在可变类中创建不可变对象的好方法是什么?

【问题讨论】:

  • 如果您希望它是不可变的,则将类设计为不可变的(或者如果您不能这样做,则将其包装为 不可变的类) .
  • 不可能。要么提供一个每次调用时返回一个新实例的方法,要么定义一个只读接口并使其成为常量的类型,或者创建一个包装原始类并防止修改的类。

标签: java oop object immutability


【解决方案1】:

如果您需要使类不可变,那么您需要满足以下要求:

  • 所有字段最终
  • 声明为 final 的类
  • 在构造过程中不允许此引用逃逸
  • 任何引用可变数据对象的字段是:
    • 私人
    • 没有setter方法
    • 它们永远不会直接返回,否则会暴露给调用者
    • 如果它们在类内部发生更改,则此更改是不可见的,并且在类外部没有影响

【讨论】:

  • 说得对,但它没有回答问题。
【解决方案2】:

如果您不能修改类以使其不可变(具有最终字段的最终类等),那么只需为自己编写一个不可变的包装器(来自 GOF 的代理?)并使用它来代替。在它里面可以有一个委托给你的原始类实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 2014-08-24
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多