我正在从事项目工作,在那里我被告知将所有字符串声明为常量并从那里获取。我想了解这背后的需要。声明属性名称为字符串常量是好方法吗?
回答
这是“没有魔术常量”方针:不只是插入常量到代码直接,因为它们看起来像莫名其妙的“魔力”。如果您多次使用相同的常量,它也有助于避免输入错误。
但是,如果常量的名称是一样的字符串(模数格式和空格),它缺少了这一点的内容,这是毫无意义,在我看来。
此外,如果字符串显然是一个提示给用户,它是而不是不明原因的魔术,所以这个准则是完全不适用的,不应该在这种情况下应用。
如果字符串常量是在多个地方使用,并且该程序的正确运行需要这个,最好是使用一个常数,例如
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 ..
现在编译器会强制只传递有效的常量。
对于非重用字符串常量,我不会理会,除非它是有道理的。不应盲目遵守教条式的规则。如果有意义,就去做吧。
你介意在例子中选择一个不同的名字吗?我知道这仅仅是一个例子,但我们不希望人们认为用'“one”'的值声明一个名为'ONE'的常量是个好主意。它违背了声明常量的两个目的:它不会使用法更清楚(“ONE”不能表达比“1”更多的含义),并且当您想要在全局范围内更改该值时它不起作用或者以'public static final String ONE =“2”;'结尾,或者[你必须搜索每个出现的'ONE'并将其改为'TWO'](http://thecodelesscode.com/case/95 )) –
作为一个经验法则:如果你能想到可以形容不变(在上下文中的使用说明),比字面本身更好的名字 - 声明一个全局常量。如果你不能 - 使用文字。
例如:如果您有System.out.println("Hello")
,则很难为字符串文字找到更好的名称 - HELLO
? HELLO_STRING
? TEXT_THAT_SAYS_HELLO
?这些东西没有增加太多价值,所以我们最好直接使用文字。但是,如果我们添加一些上下文 - 例如,"hello"
是应用程序在向用户显示内容之前向用户致意的一般方式 - 我们突然为此常量命名为 - GENERAL_GREETING
。还要注意,给我们这个名字的同一个事实使得使用全局常量更有利 - 因为它是所有地方常用的问候语,所以将其定义为全局常量是有意义的,因此我们可以轻松地在应用程序中对其进行更改。
- 它消除了多次使用相同的字符串文字散布在整个项目中,因此需要大范围的,通常很难找到的用法。
- 它提供了相同的已知记录变量,例如,而不必手动记录为常量FOO_BAR提供Javadoc的字符串“foo.bar”。
- 它消除了某些类型的小错误,如拼写错误轻微的。
- 它驱动用户可见字符串(例如提示和消息)的资源和/或配置文件的使用:在许多但并非全部的情况下,应该首选字符串常量。例如。,对于一个小小的项目,资源文件的开销可能没有意义–,你可能仍然需要常量来定义资源名称。
无论是否有意义将全部字符串值都不可能在一般意义上回答。
为避免重复: 它是一个好主意,用常量当你有相同的知名度至少有两个相同的值。例如在同一班级内。
要编写语义代码: 它不一样的
int totalPrize = product.getPrize() * 1.21f;
比:
int totalPrize = product.getPrize() * VAT;
为了揭露值与其它clases:
if(JOptionPane.YES_OPTION == response)
问题是关于* String *常量 – Bohemian
- 1. 声明字符串常量
- 2. JavaScript对象声明语法 - 作为属性的变量名称
- 3. 空字符串是合法的字段/方法名称吗?
- 4. 对象::属性(常量字符*名称)常量返回空QVariant
- 5. 常量字符串的格式声明
- 6. Android:有没有获得字符串属性名称的方法?
- 7. 如何将早期绑定的属性名称作为字符串常量?
- 8. 声明一个字符串名称的新变量
- 9. *声明字符串时,*名称和名称中的不同*
- 10. 解析不使用字符串属性名称的javascript对象声明
- 11. 将属性声明为受保护的更好的方法
- 12. 无法声明字符串变量
- 13. 获取字符串的常量名称
- 14. 将变量声明为'var'是一种好的做法吗?
- 15. “maxPwdAge”是LDAP的常量属性名称吗?
- 16. 不明白常量方法声明
- 17. 使用内置函数名称作为属性或方法标识符是不好的做法吗?
- 18. 打字稿:变量的声明/属性中的类/方法
- 19. C# - 这个声明的字符串被视为一个常量?
- 20. 没有名称属性的字符串值:字符串
- 21. 在公共常量字符串中存储私有名称是一种很好的做法吗?
- 22. PHP实例属性名字符串作为方法参数
- 23. 在声明的属性中获取属性名称
- 24. 获取行为名称作为属性参数的字符串
- 25. Python:将变量或变量的属性的名称转换为字符串
- 26. 使用字符串变量按名称查找属性
- 27. 如何根据字符串变量切换属性名称?
- 28. JSON指定带字符串变量的JObject属性名称
- 29. 为什么.NET模式验证声称名称空间lang属性未声明?
- 30. 在JavaScript对象中声明不属于字符串的属性
取决于项目等。 – Maroun
请在您的问题中提供更多详情。问题的答案是主观的,取决于你正在进行的项目类型。 –
太模糊了,但如果这些字符串仅仅是文本字符串,并没有被用作“逻辑”,那将是设置国际化的第一步。 – Frankie