gpt4 book ai didi

java - 不可变对象(immutable对象)和惰性初始化。

转载 作者:搜寻专家 更新时间:2023-11-01 01:13:11 26 4
gpt4 key购买 nike

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

上面是我正在看的文章。不可变对象(immutable对象)极大地简化了您的程序,因为它们:

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

  • 谁能解释一下作者在上面想表达的意思行。
  • 如果我的类标记为 final 并且它的实例变量是不可变的仍然不是最终的,反之亦然 我的实例变量是最终的类是正常的

最佳答案

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

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

如果您想进行惰性计算(仅在需要时才计算哈希码),如果您想保持不可变对象(immutable对象)的线程安全特性,那就有点棘手了。

最简单的方法是声明一个 private volatile int hash; 并在它为 0 时运行计算。除了 hashcode 确实为 0 的对象(如果您的哈希码为 40 亿分之一),您将变得懒惰哈希方法分布良好)。

或者,您可以将它与一个 volatile boolean 值结合使用,但需要注意更新这两个变量的顺序。

最后,为了获得额外的性能,您可以使用 String 类使用的方法,该方法使用额外的局部变量进行计算,从而在保证正确性的同时摆脱 volatile 关键字。如果您不完全理解为什么要这样做,最后一种方法很容易出错...

关于java - 不可变对象(immutable对象)和惰性初始化。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18948990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com