0

我正在研究项目,我被告知将所有字符串声明为常量并从那里获取。我想了解这背后的需求。

4

5 回答 5

1

这是“无魔法常量”的指导方针:不要直接将常量插入代码中,因为它们看起来像是无法解释的“魔法”。如果您多次使用相同的常量,它也有助于避免拼写错误。

但是,如果常量的名称与字符串的内容(模格式和空格)相同,那么在我看来,它就失去了意义,而且毫无意义。

此外,如果字符串显然是对用户的提示,则它不是无法解释的魔法,因此该指南完全不适用,不应在这种情况下应用。

于 2013-10-13T13:23:29.450 回答
0

作为一个经验法则:如果你能想到一个可以比文字本身更好地描述常量(在它的使用上下文中)的名称 - 声明一个全局常量。如果你不能 - 使用文字。

例如:如果您有System.out.println("Hello"),很难为字符串文字找到更好的名称 - HELLO? HELLO_STRING? TEXT_THAT_SAYS_HELLO? 这些东西不会增加太多价值,所以我们最好直接使用文字。但是,如果我们添加一些上下文 - 例如,这"hello"是应用程序在向用户显示内容之前向用户打招呼的一般方式 - 我们突然为这个常量有了一个更好的名称 - GENERAL_GREETING. 另请注意,给我们命名的同一事实使得使用全局常量更有利 - 因为它是在任何地方使用的通用问候语,将其定义为全局常量是有意义的,这样我们就可以在应用程序中轻松更改它。

于 2013-10-13T13:39:26.000 回答
0
  • 它消除了散布在您的项目中的相同字符串文字的多次使用,从而需要大规模、通常难以找到的用法。
  • 它为相同的变量提供已知的记录变量,例如,您不必手动记录字符串“foo.bar”,而是为常量 FOO_BAR 提供 Javadocs。
  • 它消除了某些类型的小错误,例如小拼写错误。
  • 它为用户可见的字符串(例如提示和消息)驱动资源和/或配置文件的使用:在许多(但不是全部)情况下,这应该优于字符串常量。例如,对于一个很小的项目,资源文件的开销可能没有意义——而且您可能仍然需要常量来定义资源名称。

在一般意义上无法回答将所有字符串值常量化是否有意义。

于 2013-10-13T13:52:01.163 回答
0
  • 避免重复:当您至少有两个具有相同可见性的相同值时,使用常量是一个好主意。例如在同一个班级内。

  • 写语义代码:不一样

    int totalPrize = product.getPrize() * 1.21f;
    

    比:

    int totalPrize = product.getPrize() * VAT;
    
  • 要将值公开给其他类:

    if(JOptionPane.YES_OPTION == response)
    
于 2013-10-13T13:58:03.083 回答
0

如果 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 ..

现在编译器将强制只传递有效的常量。

对于未重用的字符串常量,除非有意义,否则我不会打扰。不应盲目遵循教条主义。如果有意义就去做。

于 2013-10-13T13:24:56.370 回答