如何处理Final Strings?

时间:2011-01-16 07:37:54

标签: java string types

制作String as final或者我们可以制作String as final有什么好处吗?我的理解是,因为字符串是不可变的,所以没有必要使它成为最终的,这是正确的还是它们的情况人们想要制作String as Final

代码:

private final String a = "test";

or 

private String b = "test";

6 个答案:

答案 0 :(得分:10)

final表示引用永远不会改变。 String不变性意味着不同的东西;它意味着当创建String(值,而不是引用,即:“text”)时,它不能被更改。

例如:

String x = "Strings Are ";
String s = x;

现在s和x都引用相同的String。但是:

x += " Immutable Objects!";
System.out.println("x = " + x);
System.out.println("s = " + s);

这将打印:

x = Strings Are Immutable Objects
s = Strings Are

这证明创建的任何String都无法更改,并且当发生任何更改时,会创建新的String

现在,对于final,如果我们将x声明为final并尝试更改其值,我们将获得例外:

final String x = "Strings Are ";
x += " Immutable Objects!";

以下是例外:

java.lang.RuntimeException: Uncompilable source code - cannot assign a value to final variable x

答案 1 :(得分:4)

这意味着变量甚至不能指向不同的字符串。

(是的,一个String对象是不可变的......但是一个变量可以指向一个不同的String实例。除非它是最终的。)

(编辑 - 在你的例子中,你没有命名你的变量......

final String x = "test";

答案 2 :(得分:4)

final表示引用不能更改,而不是值。无论决赛如何,弦乐总是不变的。

final String a = "test";
String b = "hello";

a = "world"; // error, a can't change reference to the String object "world"
b = "two"; // ok, b points to a different String object "two"

答案 3 :(得分:1)

final平均变量无法更改。

final String s = "abcd";
// later in the code
s = "efgh";  // This will not compile

不可变意味着String上有方法可以更改其中的内容,例如setterappend

答案 4 :(得分:0)

这里一切都很好,但是有两种方法可以解决“处理Final Strings ”的问题,正如你所说的那样,但就“放置它们的位置”而言:

  1. 创建一个包含最终静态变量(和最终字符串)的接口,并在需要的地方实现它,
  2. 为常量创建一个类并进行静态导入。
  3. 方式1,在大约10年前很流行,可能仍然是你有大量最终变量的地方。 方式2,使用简单但有点奇怪,因为你可以在没有资格的情况下引用常量,这使你的代码难以理解。

答案 5 :(得分:0)

拥有final字段的一个区别是,因为String是不可变的,所以它也可能是静态的。

private final String a = "test";

稍微高效,可能更清晰

private static final String a = "test";