我正在研究项目,我被告知将所有字符串声明为常量并从那里获取。我想了解这背后的需求。
5 回答
这是“无魔法常量”的指导方针:不要直接将常量插入代码中,因为它们看起来像是无法解释的“魔法”。如果您多次使用相同的常量,它也有助于避免拼写错误。
但是,如果常量的名称与字符串的内容(模格式和空格)相同,那么在我看来,它就失去了意义,而且毫无意义。
此外,如果字符串显然是对用户的提示,则它不是无法解释的魔法,因此该指南完全不适用,不应在这种情况下应用。
作为一个经验法则:如果你能想到一个可以比文字本身更好地描述常量(在它的使用上下文中)的名称 - 声明一个全局常量。如果你不能 - 使用文字。
例如:如果您有System.out.println("Hello")
,很难为字符串文字找到更好的名称 - HELLO
? HELLO_STRING
? TEXT_THAT_SAYS_HELLO
? 这些东西不会增加太多价值,所以我们最好直接使用文字。但是,如果我们添加一些上下文 - 例如,这"hello"
是应用程序在向用户显示内容之前向用户打招呼的一般方式 - 我们突然为这个常量有了一个更好的名称 - GENERAL_GREETING
. 另请注意,给我们命名的同一事实使得使用全局常量更有利 - 因为它是在任何地方使用的通用问候语,将其定义为全局常量是有意义的,这样我们就可以在应用程序中轻松更改它。
- 它消除了散布在您的项目中的相同字符串文字的多次使用,从而需要大规模、通常难以找到的用法。
- 它为相同的变量提供已知的记录变量,例如,您不必手动记录字符串“foo.bar”,而是为常量 FOO_BAR 提供 Javadocs。
- 它消除了某些类型的小错误,例如小拼写错误。
- 它为用户可见的字符串(例如提示和消息)驱动资源和/或配置文件的使用:在许多(但不是全部)情况下,这应该优于字符串常量。例如,对于一个很小的项目,资源文件的开销可能没有意义——而且您可能仍然需要常量来定义资源名称。
在一般意义上无法回答将所有字符串值常量化是否有意义。
避免重复:当您至少有两个具有相同可见性的相同值时,使用常量是一个好主意。例如在同一个班级内。
写语义代码:不一样
int totalPrize = product.getPrize() * 1.21f;
比:
int totalPrize = product.getPrize() * VAT;
要将值公开给其他类:
if(JOptionPane.YES_OPTION == response)
如果 String 常量在多个地方使用,并且程序的正确运行需要这样做,则最好使用常量,例如
public static final String ONE = "apple";
// client usage
doSomething(ONE);
// service usage
void doSomething(String action) {
if (action.equals(ONE)) {
// whatever
else ...
}
没有常量,你会得到“字符串类型”的代码,因为你可以传递垃圾并且代码将编译:
doSomething("foo"); // compiles, but won't function correctly
但是,使用字符串作为有意义的常量仍然是“松散”的代码。最好使用枚举:
enum Action {
ONE, TWO, THREE
}
void doSomething(Action action) {
if (action == ONE) {
// whatever
else ..
现在编译器将强制只传递有效的常量。
对于未重用的字符串常量,除非有意义,否则我不会打扰。不应盲目遵循教条主义。如果有意义就去做。