gpt4 book ai didi

java - 不可变类应该是最终的?

转载 作者:IT老高 更新时间:2023-10-28 20:51:30 24 4
gpt4 key购买 nike

它在 this article 中说那个:

Making a class final because it is immutable is a good reason to do so.

对此我有点困惑...我知道从线程安全性和简单性的观点来看,不变性是一件好事,但似乎这些问题与可扩展性有些正交。那么,为什么不可变性是使类成为 final 的一个很好的理由呢?

最佳答案

《Effective Java》一书中对此进行了解释

考虑 Java 中的 BigDecimalBigInteger 类。

不可变类必须是有效的最终类并没有被广泛理解当 BigIntegerBigDecimal 被编写时,所以它们的所有方法都可能是被覆盖。不幸的是,在保持向后兼容性的同时,这无法在事后更正。

如果您编写的类的安全性取决于来自不受信任客户端的 BigInteger 或 BigDecimal 参数的不变性,则必须检查该参数是否是“真实的”BigInteger 或 BigDecimal,而不是不受信任的子类的实例。如果是后者,您必须在假设它可能是可变的情况下防御性地复制它。

   public static BigInteger safeInstance(BigInteger val) {

if (val.getClass() != BigInteger.class)

return new BigInteger(val.toByteArray());


return val;

}

如果你允许子类化,它可能会破坏不可变对象(immutable对象)的“纯度”。

关于java - 不可变类应该是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/146311/

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