Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在可变Java类中定义不可变对象?_Java_Oop_Object_Immutability - Fatal编程技术网

如何在可变Java类中定义不可变对象?

如何在可变Java类中定义不可变对象?,java,oop,object,immutability,Java,Oop,Object,Immutability,在一个类中,我想定义一个空对象,并在我们需要它的任何地方使用它。此对象需要是不可变的,以避免意外修改。如果此对象定义为类的公共静态final成员,则如果类本身是可变的,则可以更改该对象 在可变类中创建不可变对象的好方法是什么?如果您无法修改该类使其不可变(最终类带有最终字段等),那么只需编写一个不可变包装器(来自GOF的代理?)并使用它即可。它内部可以有一个对原始类实例的委托。如果需要使类不可变,则需要满足以下要求: 所有字段都是最终字段 该类被宣布为最终类 在施工期间,不允许逃逸此参考 引用

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


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

如果您无法修改该类使其不可变(最终类带有最终字段等),那么只需编写一个不可变包装器(来自GOF的代理?)并使用它即可。它内部可以有一个对原始类实例的委托。

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

  • 所有字段都是最终字段
  • 该类被宣布为最终类
  • 在施工期间,不允许逃逸此参考
  • 引用可变数据对象的任何字段包括:
    • 私人的
    • 没有setter方法
    • 它们不会直接返回,否则会暴露给调用方
    • 如果它们在类内部更改,则此更改不可见,并且在类外部没有影响

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