这可能是有史以来提出的最简单的问题,但我认为它对Java新手来说相当困惑.
- 有人可以澄清不可变的意思吗?
- 为什么
String
不可变? - 不可变对象的优点/缺点是什么?
- 为什么比String和viceversion更喜欢像
StringBuilder
这样的可变对象?
一个很好的例子(在Java中)将非常感谢.
这可能是有史以来提出的最简单的问题,但我认为它对Java新手来说相当困惑.
String
不可变? 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私有状态(因此无法在线程之间安全共享).