【问题标题】:Java: When do you choose to make your class immutable over mutable [duplicate]Java:你什么时候选择让你的类不可变而不是可变的[重复]
【发布时间】:2012-06-07 18:39:48
【问题描述】:

可能重复:
Mutable vs immutable objects

我了解不可变对象与可变对象之间的优缺点,但是当你来设计它时,你如何决定选择哪一个。

我之所以问这个问题是因为如果它是可变的,您可以通过将对象更改回初始状态来重用该对象,因为它既高效又经济,因此当您处理多步操作时,您可以重用它一遍又一遍。而当您执行多步操作时,不可变对象的性能会被放大,因为它在每一步都会生成一个新对象。

示例如下:

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

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

【问题讨论】:

标签: java memory-management


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 2010-09-23
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2012-04-25
      相关资源
      最近更新 更多