如何处理最终字符串?

Posted

技术标签:

【中文标题】如何处理最终字符串?【英文标题】:How to deal with Final Strings? 【发布时间】:2011-06-09 21:54:00 【问题描述】:

制作String as final 有什么好处吗?或者我们可以制作String as final 吗?我的理解是,由于String 是不可变的,因此没有必要将其定为最终结果,这是正确的还是人们想要的情况制作String as Final ?

代码:

private final String a = "test";

or 

private String b = "test";

【问题讨论】:

【参考方案1】:

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

例如:

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

【讨论】:

【参考方案2】:

这意味着 variable 永远不能指向不同的字符串。

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

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

final String x = "test";

)

【讨论】:

String is immutable 到底是什么意思,我的印象是它的值不能改变,final关键字的作用也是一样,是不是我的理解不对? 表示可以说x = "this";和 x = "that",但是没有像 x.setValue("new string"); 这样的方法。【参考方案3】:

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"

【讨论】:

【参考方案4】:

final 均值变量无法更改。

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

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

【讨论】:

不应该是“String上没有方法”吗?【参考方案5】:

这里一切正常,但还有两种方法可以“处理最终字符串”,正如您所说,但就“放置它们的位置”而言:

    创建一个包含最终静态变量(和最终字符串)的接口,并在需要它们的任何地方实现它,并且 为常量创建一个类并进行静态导入。

方式 1,大约 10 年前很流行,并且可能仍然是您拥有大量最终变量的地方。 方式 2,使用简单但有点奇怪,因为您可以不加限定地引用常量,这使您的代码难以理解。

【讨论】:

【参考方案6】:

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

private final String a = "test";

效率稍高,可能更清晰

private static final String a = "test";

【讨论】:

以上是关于如何处理最终字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 JSONDecoder 中的空日期字符串

如何处理此字符串?

Web Api 如何处理这个查询字符串?

如何处理 Freemarker 字符串模板?

如何处理插入 '\0' 的字符数组?

生命周期如何处理常量字符串/字符串文字?