Java:你什么时候选择让你的类在变异上变得不可变

时间:2012-06-07 18:39:48

标签: java memory-management

  

可能重复:
  Mutable vs immutable objects

我理解Immutable对象与Mutable对象之间的利弊,但是当你设计它时,你如何决定使用哪一个。

我之所以问这个问题,是因为如果它是可变的,你只需将对象更改回初始状态就可以重用该对象,因为它是高效且经济的方式,所以当你处理多步操作时,你可以重用它一遍又一遍。而当您执行多步操作时,不可变对象性能会被放大,因为它会在每一步生成一个新对象。 < - 就记忆而言

以下是示例:

   //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
   }

我知道不可变对象是安全的,不需要同步,简单和共享内部,但除此之外有什么特别的原因吗?什么时候我们应该让我们的班级成为最终的(不可改变的)?

2 个答案:

答案 0 :(得分:1)

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

这是Java早期使用的一种现在不受欢迎的技术。让虚拟机和垃圾收集器完成其工作并为其用例设计代码,忽略这种USUALLY'虚构'优化。

答案 1 :(得分:0)

我在以下情况下使用不可变对象:

  1. 在多线程环境中工作,不可变对象非常适合线程间通信(消息)
  2. 当对象不保持其成员变量在应用程序的生命周期内不发生更改的状态时。示例,用户凭据