我的编程生活中有各种各样的时刻,我希望String类没有最终/密封/ NotInheritable。
建筑师试图阻止我这样做的语言是什么,会让猴子扳手投入工作。
相反,语言架构师希望通过限制我扩展String类来阻止我投入到作品中的猴子扳手是什么?
你能列出一个可扩展字符串类的优缺点列表吗?
答案 0 :(得分:5)
字符串是immutable class,这意味着如果在创建后无法修改其状态。如果您可以在输入另一个库后修改字符串,或者例如Map,则结果将是不可预测的。
Java API的一个错误是BigInteger
和BigDecimal
不是最终的,这意味着当从非受信任的代码接收这些对象时,您需要执行这些对象的防御性副本。相反,您始终可以相信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会被劫持。