【发布时间】:2011-11-19 21:44:36
【问题描述】:
我通常将全局编译时变量(例如我使用的常量,例如 avogadro 的数字或其他)放入公共静态最终变量中。但是,我从未考虑过这是否真的对字符串有任何作用。既然它已经是不可变的,那么制作一个最终的 String 有什么意义吗?
这是一个理论问题,而不是一个实际问题。
【问题讨论】:
我通常将全局编译时变量(例如我使用的常量,例如 avogadro 的数字或其他)放入公共静态最终变量中。但是,我从未考虑过这是否真的对字符串有任何作用。既然它已经是不可变的,那么制作一个最终的 String 有什么意义吗?
这是一个理论问题,而不是一个实际问题。
【问题讨论】:
final 不同于不可变。 final 表示处理程序(变量)不能指向另一个对象。不可变意味着对象不能改变其内部状态。
static final Foo foo = new Foo(1) 表示您以后不能拥有foo = new Foo(2)
Foo 是不可变的,则意味着一旦创建它,就无法更改其字段。例如。你不能有Foo foo = new Foo(1); foo.setValue(3);
【讨论】:
您对字符串的引用和实际字符串混淆了。不可变描述了实际的字符串对象,意味着您不能更改该对象的值。 Final 指的是对字符串对象的引用,这意味着您无法更改该引用指向的字符串。 考虑以下代码: 公共静态字符串str =“快乐”; ... str = "悲伤";
这段代码创建了两个字符串对象,一个包含值“happy”,一个包含值“sad”。这些对象都不能更改(因为字符串是不可变的)。 str 是一个引用,可以指向这些对象中的任何一个;但是,我们是否将第一行代码更改为: public static final String str = "happy"; str = "sad" 将不再合法。因为我们已经将 str 更改为 final 变量,所以它不能指向不同的对象。
【讨论】:
final 仅适用于引用。如果您声明一个 Object final 并不意味着该对象不能更改,它不允许更改对对象的引用。它与不可变不是一回事。
【讨论】: