在Java中定义常量字符串?


73

我有一个常量字符串列表,需要在Java程序中的不同时间显示它们。

在CI中,可以在代码顶部定义如下字符串:

我想知道在Java中做这种事情的标准方法是什么?


4
static final String WELCOME_MESSAGE = "Hello";
奥利弗·查尔斯沃思

4
是的,但是我读过一些网站,他们在说“ final”不是java中的常量,所以我不确定。
csss 2012年

15
finalJava中的@csss表示引用无法更改-但指向的对象仍然可以更改。对我们来说幸运的是,String在Java中是一个不可变的类,因此afinal String在这两个方面都是const。
yshavit 2012年

Answers:


132

通常,您可以在类的顶部定义它:

public static final String WELCOME_MESSAGE = "Hello, welcome to the server";

当然,根据使用此常量的位置,使用适当的成员可见性(public/ private/ protected)。


2
我一直想知道,如果将常量定义为“私有”,是否不必将常量设置为“静态”?
挑战

8
不,它应该仍然是static。每次实例化类型时,将其设置为私有和非静态仍将创建该字符串的新副本。参见stackoverflow.com/q/1415955/247763
derekerdmann,2016年

12

它看起来像这样:

public static final String WELCOME_MESSAGE = "Hello, welcome to the server";

如果这些常数仅在单个类中使用,则希望将其private改为public


5
public static final String YOUR_STRING_CONSTANT = "";

5

我们通常将常数声明为static。这样做的原因是因为Java每次实例化该类的对象时都会创建非静态变量的副本。

因此,如果我们使常量不变static,那么它将节省内存

通过final我们可以使变量恒定。

因此,定义常量的最佳实践如下:

private static final String YOUR_CONSTANT = "Some Value"; 

访问修饰符可以private/public取决于业务逻辑。


1
你错了。由于JVM使用了字符串池,因此无助于节省内存。
Mirimas'5

@Mirimas Nope。老兄,你错了。静态仅初始化一次,但每次初始化非静态变量的对象时,都会初始化一次。
Pritam Banerjee

3
这里使用了字符串池,因为您不使用“ new”关键字来创建字符串。因此,即使您不对字符串使用static,它也会使用已从字符串池创建的引用。查看更多:stackoverflow.com/questions/3297867/...
Mirimas

4

您可以使用

 public static final String HELLO = "hello";

如果您有许多字符串常量,则可以使用外部属性文件/简单的“常量持有者”类


4

或行业中的另一个典型标准是拥有一个Constants.java命名类文件,其中包含要在整个项目中使用的所有常量。


2

只需使用

final String WELCOME_MESSAGE = "Hello, welcome to the server";

该指令的主要部分是“最终”关键字。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.