为什么String类是final?

时间:2010-08-02 01:37:59

标签: c# java string final sealed

  

可能重复:
  Why is String final in Java?

我的编程生活中有各种各样的时刻,我希望String类没有最终/密封/ NotInheritable。

建筑师试图阻止我这样做的语言是什么,会让猴子扳手投入工作。

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

你能列出一个可扩展字符串类的优缺点列表吗?

2 个答案:

答案 0 :(得分:5)

字符串是immutable class,这意味着如果在创建后无法修改其状态。如果您可以在输入另一个库后修改字符串,或者例如Map,则结果将是不可预测的。

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

不值得信赖的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());
}

答案 1 :(得分:4)

String是final,因为它表示不可变的数据类型。由于有很多库依赖于String对象的不变性,所以可以很好地扩展String,从而导致流形错误。

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