为什么他们决定String在 Java 和 .NET(以及其他一些语言)中实现不可变?他们为什么不让它可变呢?
String
根据Effective Java,第 4 章,第 73 页,第 2 版:
“这有很多很好的理由:不可变类比可变类更容易设计、实现和使用。它们更不容易出错并且更安全。 […] ” 不可变对象很简单。 一个不可变对象可以只处于一种状态,即创建它的状态。如果您确保所有构造函数都建立类不变量,那么可以保证这些不变量将始终保持正确,并且没有你的努力。 […] 不可变对象本质上是线程安全的; 它们不需要同步。它们不会被同时访问它们的多个线程破坏。这无疑是实现线程安全的最简单方法。事实上,没有线程可以观察到另一个线程对不可变对象的任何影响。因此, 不可变对象可以自由共享 […]
“这有很多很好的理由:不可变类比可变类更容易设计、实现和使用。它们更不容易出错并且更安全。
[…]
” 不可变对象很简单。 一个不可变对象可以只处于一种状态,即创建它的状态。如果您确保所有构造函数都建立类不变量,那么可以保证这些不变量将始终保持正确,并且没有你的努力。
不可变对象本质上是线程安全的; 它们不需要同步。它们不会被同时访问它们的多个线程破坏。这无疑是实现线程安全的最简单方法。事实上,没有线程可以观察到另一个线程对不可变对象的任何影响。因此, 不可变对象可以自由共享
同一章的其他小点:
您不仅可以共享不可变对象,还可以共享它们的内部结构。 […] 不可变对象为其他对象(无论是可变的还是不可变的)提供了很好的构建块。 […] 不可变类唯一真正的缺点是它们需要为每个不同的值使用单独的对象。
您不仅可以共享不可变对象,还可以共享它们的内部结构。
不可变对象为其他对象(无论是可变的还是不可变的)提供了很好的构建块。
不可变类唯一真正的缺点是它们需要为每个不同的值使用单独的对象。