不可变的字符串和final关键字

时间:2011-11-19 21:44:36

标签: java string

我通常将全局编译时变量(比如我使用的常量,如avogadro的数字或其他)放入公共静态最终变量中。但是,我还没有考虑过这对Strings是否真的有用。在制作一个String final是否有任何意义,因为它已经是不可变的了?

这不仅仅是一个理论上的问题。

3 个答案:

答案 0 :(得分:10)

final与immutable不同。 final表示处理程序(变量)不能指向另一个对象。不可变意味着对象不能改变其内部状态。

  • static final Foo foo = new Foo(1)表示您以后不能foo = new Foo(2)
  • 如果Foo是不可变的,则意味着一旦创建它,​​就无法更改其字段。例如。你不能拥有Foo foo = new Foo(1); foo.setValue(3);

答案 1 :(得分:2)

你得到了对字符串的引用和实际的字符串混淆。 Immutable描述实际的字符串对象,意味着您无法更改该对象的值。 Final指的是对字符串对象的引用,这意味着您无法更改引用所指向的字符串。 请考虑以下代码: public static String str =“happy”; ... str =“sad”;

此代码创建两个字符串对象,一个包含值“happy”,另一个包含值“sad”。这两个对象(因为字符串是不可变的)都不能更改。 str是一个引用,可以指向这些对象中的任何一个;但是,我们是否要将第一行代码更改为:public static final String str =“happy”; str =“悲伤”将不再合法。因为我们已将str更改为最终变量,所以不能指向不同的对象。

答案 2 :(得分:1)

final仅适用于参考。如果声明一个Object final并不意味着该对象无法更改,则它不允许对要更改的对象的引用。这与不可变的不一样。