<分区>
Possible Duplicate:
Why is String final in Java?
在我的编程生涯中有很多时刻我希望 String 类不是最终的/密封的/不可继承的。
语言架构师试图阻止我这样做会把 Activity Spanner 扔进工作中的是什么。
相反,语言架构师想要通过限制我扩展 String 类来阻止我投入工作的 Activity Spanner 是什么?
您能否列出可扩展字符串类的优缺点列表?
<分区>
Possible Duplicate:
Why is String final in Java?
在我的编程生涯中有很多时刻我希望 String 类不是最终的/密封的/不可继承的。
语言架构师试图阻止我这样做会把 Activity Spanner 扔进工作中的是什么。
相反,语言架构师想要通过限制我扩展 String 类来阻止我投入工作的 Activity Spanner 是什么?
您能否列出可扩展字符串类的优缺点列表?
最佳答案
字符串是一个 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());
}
关于c# - 为什么 String 类是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384498/