在Java中跨许多类共享常量string?
我想在一个地方使用Java常量string,并在整个项目(很多类)中使用它们。
推荐的方法是什么?
public static final String CONSTANT_STRING="CONSTANT_STRING";
常数应该是:
- 公开 – 这样就可以从任何地方访问它
- 静态 – 无需创build实例
- 最后 – 因为它的常数不能改变
- 按照Java命名约定应该大写,以便在Java文档中易于阅读和脱颖而出。
有些接口只是用来保持常量,虽然我没有看到任何理由这样做,也被认为是一个不好的做法,创造一个接口来保持常量,另一种方法是保持在它使更多的类感。
例如
JFrame
具有EXIT_ON_CLOSE
常量,任何JFrame
子类都可以访问它,保留JFrame
而不是JComponent
也是有意义的,因为并不是所有的组件都有closures的选项。
你应该创build一个存储所有常量的常量类。
像ProjectNameConstants.java
其中包含所有常量string静态,因为您可以通过类名来访问它。
例如
classname : MyAppConstants.java public static final String MY_CONST="my const string val";
你可以像访问它一样
MyAppConstants.MY_CONST
正如@mprabhat之前回答的那样,常量应该是public
, static
, final
,并且用大写字母来input。
在课堂上将他们分组可以帮助您:
-
不需要知道你所有的常量。 许多IDE(如Eclipse)向您显示一个类所有的字段列表。 所以你只需按
CTRL+SPACE
就可以知道你可以使用哪些常量。 -
在编译时使它们变为安全types。 如果你使用了
String
,你可能会拼错"DATABASE_EXCEPTION"
和"DATABSE_EXSCEPTION"
,只有在执行时注意(如果你幸运的话,注意到它)。 您也可以利用自动完成function。 -
帮助您在执行过程中节省内存。 你只需要一个常量的实例的内存。 IE:(一个真实的例子)如果你在代码的不同类中有1000次
String
“DATABASE_EXCEPTION”,它们中的每一个在内存中将是不同的实例。
您可能还有其他一些考虑因素:
-
添加javadoc注释,所以使用常量的程序员可以在常量上有更多的语义信息。 当按
CTRL+SPACE
键时,它被显示为一个工具提示。 IE:/** Indicates an exception during data retrieving, not during connection. */ public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION"; /** Indicates an exception during the connection to a database. */ public static final String DATABASE_CONNECTION_EXCEPTION =" DATABASE_CONNECTION_EXCEPTION";
-
将语义添加到常量的标识符。 如果你有恒定的
"Y"
,有时意味着是和其他时间年 ,考虑使用2个不同的常量。public static final String Y = "Y"; // Bad public static final String YEAR = "Y"; public static final String YES = "Y";
如果将来决定改变常数的值,它将会对你有所帮助。
/** Year symbol, used for date formatters. */ public static final String YEAR = "A"; // Year is Año, in Spanish. public static final String YES = "S"; // Yes is Sí, in Spanish.
-
您可能不知道常量的价值,直到运行时。 IE:你可以从configuration文件中读取它们。
public class Constants { /** Message to be shown to the user if there's any SQL query problem. */ public static final String DATABASE_EXCEPTION_MESSAGE; // Made with the 2 following ones. public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION"; public static final String MESSAGE = "MESSAGE"; static { DATABASE_EXCEPTION_MESSAGE = DATABASE_EXCEPTION + MESSAGE; // It will be executed only once, during the class's [first] instantiation. }
}
-
如果你的常量类太大,或者你认为将来它会增长太多,你可以把它分成不同的类来表示不同的含义(再次,语义):
ConstantDB
,ConstantNetwork
等
缺点:
-
你们团队的所有成员都必须使用相同的类别和常量的相同术语。 在一个大型项目中,find2个定义并不奇怪:
public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION"; public static final String EXCEPTION_DATABASE = "DATABASE_EXCEPTION";
分开数百行或不同的常量类。 甚至更糟糕的是:
/** Indicates an exception during data retrieving, not during connection. */ public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION"; /** Indicates an exception during data retrieving, not during connection. */ public static final String EXCEPTION_DATABASE = "EXCEPTION_DATABASE";
不同的标识符,不同的值,具有相同的含义(并用于相同的目的)。
-
这可能会使可读性变差。 不得不写更多的做同样的事情:
if ("Y".equals(getOptionSelected()) {
VS
if (ConstantsWebForm.YES.equals(getOptionSeleted()) {
-
常量是如何在课堂上sorting的? 按字母顺序? 所有相关的常量在一起? 为了创build/需要它们? 谁应该对订单负责? 任何(足够大的)重新sorting的常量在版本系统中都会被视为一团糟。
那么,它比我预期的要长。 任何帮助/评论家都欢迎。
最佳实践是使用Java Enum(Java 5之后)
课堂教学的问题:
- 不是types安全的
- 没有命名空间
- 脆性
请检查Java文档。
public enum Constants { CONSTANT_STRING1("CONSTANT_VALUE1"), CONSTANT_STRING2("CONSTANT_VALUE2"), CONSTANT_STRING3("CONSTANT_VALUE3"); private String constants; private Constants(String cons) { this.constants = cons; } }
枚举可以用作常量。
编辑:你可以调用这个Constants.CONSTANT_STRING1
public class SomeClass { public static final String MY_CONST = "Some Value"; }
如果它应该是一个纯粹的常量类,那么使构造函数也是私有的。
public class Constants { public static final String CONST_1 = "Value 1"; public static final int CONST_2 = 754; private Constants() { } }
那么就不可能实例化这个类。
在你的主包(即com.yourcompany)的基础上创build一个名为Constants
的类,并在其中包含所有常量。 另外使构造函数是私有的,所以不会从这个类创build对象:
public class Constants { private Constants() { // No need to create Constants objects } public static final String CONSTANT_ONE = "VALUE_CONSTANT_ONE"; public static final String CONSTANT_TWO = "VALUE_CONSTANT_TWO"; }
你应该把你的常量分成它们属于的组,并且将它们定义为public static final。 当你走的时候,看起来合适的是有定义你的常量的接口,但是抵制创build一个包含所有常量的单一接口的冲动。 这只是不好的devise。
创build一个公共class
并为每个常量string创build一个像这样的字段
public static final String variableName = "string value";
public enum Constants { CONSTANT_STRING1("CONSTANT_VALUE1"), CONSTANT_STRING2("CONSTANT_VALUE2"), CONSTANT_STRING3("CONSTANT_VALUE3"); private String constants; private Constants(String cons) { this.constants = cons; } @JsonValue @Override public String toString() { return constants; }
}
使用它Constants.CONSTANT_STRING1.toString()