我正在研究项目,我被告知将所有字符串声明为常量并从那里获取。我想了解这背后的需求。
答案 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")
,则很难找到字符串文字的更好名称 - HELLO
? HELLO_STRING
? TEXT_THAT_SAYS_HELLO
?那些东西不会增加太多价值,所以我们最好直接使用文字。但是,如果我们添加一些上下文 - 例如,"hello"
是应用程序在向用户显示内容之前问候用户的一般方式 - 我们突然有一个更好的名称 - GENERAL_GREETING
。还要注意,给我们这个名字的相同事实使得使用全局常量更有利 - 因为它是在任何地方使用的一般问候语,将它定义为全局常量是有意义的,因此我们可以在应用程序中轻松地更改它。
答案 3 :(得分:0)
在一般意义上,无法回答是否有必要对所有字符串值进行常量化。
答案 4 :(得分:0)
为避免重复: 当您具有至少两个具有相同可见性的相同值时,最好使用常量。例如在同一个班级内。
编写语义代码: 它不一样
int totalPrize = product.getPrize() * 1.21f;
比:
int totalPrize = product.getPrize() * VAT;
将值公开给其他clases:
if(JOptionPane.YES_OPTION == response)