如何处理最终字符串?
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
上有可以更改其中内容的方法,例如setter
、append
等
【讨论】:
不应该是“String
上没有方法”吗?【参考方案5】:
这里一切正常,但还有两种方法可以“处理最终字符串”,正如您所说,但就“放置它们的位置”而言:
-
创建一个包含最终静态变量(和最终字符串)的接口,并在需要它们的任何地方实现它,并且
为常量创建一个类并进行静态导入。
方式 1,大约 10 年前很流行,并且可能仍然是您拥有大量最终变量的地方。 方式 2,使用简单但有点奇怪,因为您可以不加限定地引用常量,这使您的代码难以理解。
【讨论】:
【参考方案6】:拥有 final 字段的一个区别是,因为 String 是不可变的,所以它也可以是静态的。
private final String a = "test";
效率稍高,可能更清晰
private static final String a = "test";
【讨论】:
以上是关于如何处理最终字符串?的主要内容,如果未能解决你的问题,请参考以下文章