Java:您何时选择使类不可变而不是可变

Java:您何时选择使类不可变而不是可变,java,memory-management,Java,Memory Management,可能重复: 我理解不可变对象和可变对象之间的优缺点,但在设计时,您如何决定选择哪一个呢 我之所以要问这个问题,是因为如果对象是可变的,您可以通过将对象更改回初始状态来重用对象,因为这是一种高效且经济的方式,所以当您处理多步骤操作时,您可以反复重用它。而不可变对象性能在执行多步骤操作时会被放大,因为它在每一步都会生成一个新对象 我在以下情况下使用不可变对象: 在多线程环境中工作,不可变对象非常适合线程间通信(消息) 当一个对象不持有其成员变量在应用程序的生命周期内不会改变的状态时。例如,用户凭据

可能重复:

我理解不可变对象和可变对象之间的优缺点,但在设计时,您如何决定选择哪一个呢


我之所以要问这个问题,是因为如果对象是可变的,您可以通过将对象更改回初始状态来重用对象,因为这是一种高效且经济的方式,所以当您处理多步骤操作时,您可以反复重用它。而不可变对象性能在执行多步骤操作时会被放大,因为它在每一步都会生成一个新对象 我在以下情况下使用不可变对象:

  • 在多线程环境中工作,不可变对象非常适合线程间通信(消息)
  • 当一个对象不持有其成员变量在应用程序的生命周期内不会改变的状态时。例如,用户凭据

  • 您对可变性的推理基本上是针对对象池和创建。这不是使对象可变的好理由,除非出于某些非常特殊的原因,创建对象非常昂贵,或者需要严格控制实例的数量(如db连接和线程池)

    这是Java早期使用的一种技术,现在已不受欢迎。让VM和垃圾收集器完成它的工作,并为它的用例设计代码,忽略这种通常是“虚构的”优化。

    可能会有帮助:
       //Mutable
       A a = new A();
       for(int j = 0 ; j < 1000 ; j++){
           a.setP1(j);
           //do something
    
       }
    
       //Immutable
       for(int j = 0 ; j < 1000 ; j++){
           A a = new A(j);
           //do something
       }