在我的编程生活中,有很多时刻我希望 String 类不是最终/密封/NotInheritable。
是什么语言架构师试图阻止我这样做,这会让我的工作陷入困境。
相反,语言架构师想要通过限制我扩展 String 类来阻止我投入工作的猴子扳手是什么?
您能否列出可扩展字符串类的优缺点列表?
String 是一个不可变的类,这意味着如果您在创建它之后无法修改它的状态。如果您可以在字符串进入另一个库或 Map 之后修改它,那么结果将是不可预测的。
Java API 的一个错误是它不是最终的BigInteger
,BigDecimal
这意味着当您从不受信任的代码中接收这些对象时,您需要执行这些对象的防御性副本。相反,您始终可以相信 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());
}
String 是最终的,因为它表示不可变的数据类型。天真地扩展 String 会导致流形的可怕,因为有很多库依赖于 String 对象的不变性。
扩展 String 以使其可变对于 Sting 传递的任何代码都是不可见的,但会产生非常令人惊讶和讨厌的副作用,例如突然无法从 HashMaps 加载值,即使您从 hashCode 开始确实拥有键的 String会被劫持。