问题

这可能是有史以来提出的最简单的问题,但我认为它对Java新手来说相当困惑.

  1. 有人可以澄清不可变的意思吗?
  2. 为什么String不可变?
  3. 不可变对象的优点/缺点是什么?
  4. 为什么比String和viceversion更喜欢像StringBuilder这样的可变对象?

一个很好的例子(在Java中)将非常感谢.

  最佳答案

不可变意味着一旦对象的构造函数完成了执行,实例就不能被更改。

这很有用,因为这意味着您可以传递对周围对象的引用,而不必担心其他人会改变其内容.特别是在处理并发时,对象没有锁定问题永远不会改变

例如

 class Foo
{
     private final String myvar;

     public Foo(final String initialValue)
     {
         this.myvar = initialValue;
     }

     public String getValue()
     {
         return this.myvar;
     }
}
 

Foo不必担心调用getValue()的人可能会更改字符串中的文本.

如果您想象一个类似于Foo的类,但是使用StringBuilder而不是String作为成员,您可以看到对getValue()的调用者可以更改Foo实例的StringBuilder属性.

还要注意你可能发现的不同类型的不可变性:Eric Lippert编写了一个关于这个的博客文章.基本上你可以有一些对象,其接口是不可变的但在幕后实际的mutables私有状态(因此无法在线程之间安全共享).

  相同标签的其他问题

javastringimmutability