2013-10-13 36 views
1

我正在从事项目工作,在那里我被告知将所有字符串声明为常量并从那里获取。我想了解这背后的需要。声明属性名称为字符串常量是好方法吗?

+1

取决于项目等。 – Maroun

+0

请在您的问题中提供更多详情。问题的答案是主观的,取决于你正在进行的项目类型。 –

+1

太模糊了,但如果这些字符串仅仅是文本字符串,并没有被用作“逻辑”,那将是设置国际化的第一步。 – Frankie

回答

1

这是“没有魔术常量”方针:不只是插入常量到代码直接,因为它们看起来像莫名其妙的“魔力”。如果您多次使用相同的常量,它也有助于避免输入错误。

但是,如果常量的名称是一样的字符串(模数格式和空格),它缺少了这一点的内容,这是毫无意义,在我看来。

此外,如果字符串显然是一个提示给用户,它是而不是不明原因的魔术,所以这个准则是完全不适用的,不应该在这种情况下应用。

0

如果字符串常量是在多个地方使用,并且该程序的正确运行需要这个,最好是使用一个常数,例如

public static final String ONE = "apple"; 

// client usage 
doSomething(ONE); 

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

没有一个恒定的,你会得到“Stringly类型化”的代码,因为你可以绕过垃圾和代码编译:

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

然而,使用字符串作为有意义的常数仍然是‘宽松’的代码。最好使用一个枚举:

enum Action { 
    ONE, TWO, THREE 
} 

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

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

对于非重用字符串常量,我不会理会,除非它是有道理的。不应盲目遵守教条式的规则。如果有意义,就去做吧。

+0

你介意在例子中选择一个不同的名字吗?我知道这仅仅是一个例子,但我们不希望人们认为用'“one”'的值声明一个名为'ONE'的常量是个好主意。它违背了声明常量的两个目的:它不会使用法更清楚(“ONE”不能表达比“1”更多的含义),并且当您想要在全局范围内更改该值时它不起作用或者以'public static final String ONE =“2”;'结尾,或者[你必须搜索每个出现的'ONE'并将其改为'TWO'](http://thecodelesscode.com/case/9​​5 )) –

0

作为一个经验法则:如果你能想到可以形容不变(在上下文中的使用说明),比字面本身更好的名字 - 声明一个全局常量。如果你不能 - 使用文字。

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

0
  • 它消除了多次使用相同的字符串文字散布在整个项目中,因此需要大范围的,通常很难找到的用法。
  • 它提供了相同的已知记录变量,例如,而不必手动记录为常量FOO_BAR提供Javadoc的字符串“foo.bar”。
  • 它消除了某些类型的小错误,如拼写错误轻微的。
  • 它驱动用户可见字符串(例如提示和消息)的资源和/或配置文件的使用:在许多但并非全部的情况下,应该首选字符串常量。例如。,对于一个小小的项目,资源文件的开销可能没有意义–,你可能仍然需要常量来定义资源名称。

无论是否有意义将全部字符串值都不可能在一般意义上回答。

0
  • 为避免重复: 它是一个好主意,用常量当你有相同的知名度至少有两个相同的值。例如在同一班级内。

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

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

    比:

    int totalPrize = product.getPrize() * VAT; 
    
  • 为了揭露值与其它clases:

    if(JOptionPane.YES_OPTION == response) 
    
+0

问题是关于* String *常量 – Bohemian

相关问题