将属性名称声明为字符串常量是一种好方法吗?

时间:2013-10-13 13:13:58

标签: java

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

5 个答案:

答案 0 :(得分:1)

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

但是,如果常量的名称与字符串的内容相同(模数格式和空格),则在我看来,它缺少了点,而且没有意义。

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

答案 1 :(得分:0)

如果String常量在多个地方使用,并且程序的正确运行需要这个,那么最好使用常量,例如

public static final String ONE = "apple";

// client usage
doSomething(ONE);

// service usage
void doSomething(String action) {
    if (action.equals(ONE)) {
        // whatever
    else ...
}

没有常量,你会得到“Stringly typed”代码,因为你可以传递垃圾并且代码会编译:

doSomething("foo"); // compiles, but won't function correctly

但是,使用Strings作为有意义的常量仍然是“松散”的代码。最好使用枚举:

enum Action {
    ONE, TWO, THREE
}

void doSomething(Action action) {
    if (action == ONE) {
        // whatever
    else ..

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

对于非重用的String常量,除非有意义,否则我不会打扰。不应盲目遵循教条主义规则。如果有意义的话,那就去做吧。

答案 2 :(得分:0)

根据经验:如果你能想到一个能够比文字本身更好地描述常量(在它的使用环境中)的名称 - 声明一个全局常量。如果你不能 - 使用文字。

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

答案 3 :(得分:0)

  • 它消除了在项目中散布的相同字符串文字的多种用法,因此需要大规模,通常难以查找的用法。
  • 它提供了相同的已知文档变量,例如,不必手动记录字符串“foo.bar”,而是为常量FOO_BAR提供Javadoc。
  • 它消除了某些类型的小错误,例如轻微的拼写错误。
  • 它驱动用户可见字符串的资源和/或配置文件的使用,例如提示和消息:这应该优先于许多但不是所有情况下的字符串常量。例如,对于一个小小的项目,资源文件的开销可能没有意义 - 并且您可能仍然需要常量来定义资源名称。

在一般意义上,无法回答是否有必要对所有字符串值进行常量化。

答案 4 :(得分:0)

  • 为避免重复: 当您具有至少两个具有相同可见性的相同值时,最好使用常量。例如在同一个班级内。

  • 编写语义代码: 它不一样

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

    比:

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

    if(JOptionPane.YES_OPTION == response)