7

可能重复:
为什么 String 在 Java 中是 final 的?

在我的编程生活中,有很多时刻我希望 String 类不是最终/密封/NotInheritable。

是什么语言架构师试图阻止我这样做,这会让我的工作陷入困境。

相反,语言架构师想要通过限制我扩展 String 类来阻止我投入工作的猴子扳手是什么?

您能否列出可扩展字符串类的优缺点列表?

4

2 回答 2

5

String 是一个不可变的类,这意味着如果您在创建它之后无法修改它的状态。如果您可以在字符串进入另一个库或 Map 之后修改它,那么结果将是不可预测的。

Java API 的一个错误是它不是最终的BigIntegerBigDecimal这意味着当您从不受信任的代码中接收这些对象时,您需要执行这些对象的防御性副本。相反,您始终可以相信 aString将保持一致。

不可信的 BigInteger:

public class DestructiveBigInteger extends BigInteger {

    public DestructiveBigInteger(String value) {
        super(value);
    }

    public BigInteger add(BigInteger val) {
        return BigInteger.ONE; // add() method does not behave correctly
    }

    public BigInteger subtract(BigInteger val) {
        throw new UnsupportedOperationException("subtract is broken");
    }
}

同样的事情是不可能的String。如Effective Java中所述,您需要制作这些类型的对象的防御性副本:

public void setValue(BigInteger value) {
    this.value = new BigInteger(value.toByteArray());
}
于 2010-08-02T01:42:20.340 回答
4

String 是最终的,因为它表示不可变的数据类型。天真地扩展 String 会导致流形的可怕,因为有很多库依赖于 String 对象的不变性。

扩展 String 以使其可变对于 Sting 传递的任何代码都是不可见的,但会产生非常令人惊讶和讨厌的副作用,例如突然无法从 HashMaps 加载值,即使您从 hashCode 开始确实拥有键的 String会被劫持。

于 2010-08-02T01:45:09.273 回答