不可变对象和延迟初始化.

Kev*_*vin 4 java

http://www.javapractices.com/topic/TopicAction.do?Id=29

以上是我正在看的文章.不可变对象大大简化了程序,因为它们:

允许hashCode使用延迟初始化,并缓存其返回值

  • 任何人都可以解释一下作者在上述内容上试图说的话.
  • 是我的班immutable,如果其标记为final和实例变量仍然不是最终版本,vice-versa my instance variables being finalclass being normal.

ass*_*ias 7

正如其他人所解释的那样,因为对象的状态不会改变,所以哈希码只能计算一次.

简单的解决方案是在构造函数中预先计算它并将结果放在最终变量中(这可以保证线程安全).

如果你想进行延迟计算(只在需要时计算哈希码),如果你想保持不可变对象的线程安全特性,那就有点棘手了.

最简单的方法是声明private volatile int hash;并运行计算,如果它是0.除了哈希码真正为0的对象(如果你的哈希方法分布均匀的话,在40亿分之一)之外,你会得到懒惰.

或者,您可以将它与volatile布尔值耦合,但需要注意更新两个变量的顺序.

最后,为了获得额外的性能,您可以使用String类使用的方法,该类使用额外的局部变量进行计算,允许在保证正确性的同时去掉volatile关键字.如果你不完全理解为什么它按照它完成的方式完成,那么这最后一种方法很容易出错...

  • @Kevin不确定你的意思,但是不可变对象可以包含多个引用,并且可以被多个其他对象引用.当然,只有当(来自任何线程)可到达对象没有更多引用时,才会发生GC. (2认同)