Java 使对象不可变的可能方法

Java 使对象不可变的可能方法,java,immutability,Java,Immutability,我正在寻找一些有效的方法来构建一个不可变的类,就像Java的字符串类一样。如果对象的任何字段都不能修改,那么对象是不可变的,因此这些字段必须是final。如果不希望对象被子类化,也可以将类本身设置为final,就像String一样。 要轻松构建包含大量信息的不可变对象,您应该查看 有关详细信息,请参见如果对象的任何字段都不能修改,则该对象是不可变的,因此这些字段必须是最终的。如果不希望对象被子类化,也可以将类本身设置为final,就像String一样。 要轻松构建包含大量信息的不可变对象,您应该

我正在寻找一些有效的方法来构建一个不可变的类,就像Java的字符串类一样。

如果对象的任何字段都不能修改,那么对象是不可变的,因此这些字段必须是
final
。如果不希望对象被子类化,也可以将类本身设置为final,就像String一样。 要轻松构建包含大量信息的不可变对象,您应该查看


有关详细信息,请参见

如果对象的任何字段都不能修改,则该对象是不可变的,因此这些字段必须是
最终的
。如果不希望对象被子类化,也可以将类本身设置为final,就像String一样。 要轻松构建包含大量信息的不可变对象,您应该查看


有关更多信息,请参见

,如果您使用构造函数填充所有字段并将字段设置为最终字段-您已经完成了一部分

如果字段使用自定义类型,则可能还需要使其不可变

为安全起见,属于集合的任何字段都应使用不可修改的集合

你需要担心对象图

对象上的任何方法都需要注意非final字段。例如,String.add创建一个新的字符串。如果您需要修改一个字段,请通过复制构造函数进行修改


最后使对象成为最终对象

如果您使用构造函数填充所有字段并将字段设置为最终字段,那么您已经完成了一半

如果字段使用自定义类型,则可能还需要使其不可变

为安全起见,属于集合的任何字段都应使用不可修改的集合

你需要担心对象图

对象上的任何方法都需要注意非final字段。例如,String.add创建一个新的字符串。如果您需要修改一个字段,请通过复制构造函数进行修改

最后使对象成为最终对象

  • 所有字段都必须为空
    private
    最好是
    final
  • 确保该类不能被删除 重写-使类成为最终类, 或者使用静态工厂并保持 私人建造商
  • 必须从中填充字段 建造商/工厂
  • 不要为系统提供任何设置器 田地
  • 注意收藏。使用
    集合。不可修改*
    。此外,集合应仅包含不可变对象
  • 所有getter必须提供 不可变对象或使用
  • 不要提供任何可以 更改服务器的内部状态 反对
  • 指出,
    final
    可以是可选的<代码>字符串
    有一个缓存哈希变量,只有在调用哈希函数时才分配该变量

  • 所有字段都必须为空
    private
    最好是
    final
  • 确保该类不能被删除 重写-使类成为最终类, 或者使用静态工厂并保持 私人建造商
  • 必须从中填充字段 建造商/工厂
  • 不要为系统提供任何设置器 田地
  • 注意收藏。使用
    集合。不可修改*
    。此外,集合应仅包含不可变对象
  • 所有getter必须提供 不可变对象或使用
  • 不要提供任何可以 更改服务器的内部状态 反对


  • 指出,
    final
    可以是可选的
    String
    class
    有一个缓存
    hash
    变量,只有在调用hash函数时才分配它。

    如果他不想要子类,他也应该使类本身成为最终类。如果他不想要子类,他也应该使类本身成为最终类。你在寻找一个类似于String功能的类吗?起初我并没有这样读你的问题,但如果你读了,我会用一些字符串特定的例子来改变我的答案。它不是一个原始的类型,但你也不能认为它是一个类。字符串是唯一重载+运算符的“类”。添加两个字符串将得到一个新字符串。在常规类中不允许操作符重载。不能考虑String类吗???string类重写+运算符吗?或者编译器为你变魔术了吗?是的,不是功能方面的。它的行为应该与不可变类应该做和不应该做的相同。您正在寻找一个类似于字符串功能的类吗?起初我并没有这样读你的问题,但如果你读了,我会用一些字符串特定的例子来改变我的答案。它不是一个原始的类型,但你也不能认为它是一个类。字符串是唯一重载+运算符的“类”。添加两个字符串将得到一个新字符串。在常规类中不允许操作符重载。不能考虑String类吗???string类重写+运算符吗?或者编译器为你变魔术了吗?是的,不是功能方面的。它的行为应该与不可变类应该做和不应该做的相同。Sun字符串实现中有一个实例字段不是最终的。这一点很好。”“最终”不是一个要求。字符串中的hash变量就是一个完美的例子。您还应该考虑将类设为final,以确保没有派生类公开受保护的字段。hashCode不是final,因为它是惰性设置的。它只有一个实际值,所以它将显示为最终值。我使用不可变类,它一直扩展其他不可变类。不确定为什么需要将不可变类设为final,除非您担心它可能会被可变类扩展。否则我同意。Sun字符串实现中有一个实例字段不是最终的。这一点很好。”“最终”不是一个要求。字符串中的hash变量就是一个完美的例子。您还应该考虑将类设置为final,以确保