c# - 为什么 String 类是最终的?

标签 c# java string final sealed

<分区>

Possible Duplicate:
Why is String final in Java?

在我的编程生涯中有很多时刻我希望 String 类不是最终的/密封的/不可继承的。

语言架构师试图阻止我这样做会把 Activity Spanner 扔进工作中的是什么。

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

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

最佳答案

字符串是一个 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());
}

关于c# - 为什么 String 类是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384498/

相关文章:

c# - 进程间通信 - 现代选项?

java - 套接字编程、多线程编程。错误 : IOException: java.net.ConnectException:连接超时:连接

java - JVM 线程转储位置

java - 从字符串中命名一个对象

python - 增加给定序列的字符

c# - 将表达式 <Func<Foo, bool>> 转换为另一个表达式 <Func<Bar, bool>> 的正确方法

c# - 奇怪的 C# 命名空间问题

c# - SQL Server 2008 日期时间字段溢出

java - Log4J2 配置中的主要参数

swift - 使用 Swift 的字符串中子字符串的索引