我最近重构了一些代码,结果遇到了一个奇怪的编译器错误
class CustomerContract{
public enum BillingTerm{
MONTHLY,QUARTERLY,YEARLY;
}
public String BillingTerm = "";
}
class SalesProposal{
public String billingCycles(){
String message = "We have several billing cycles available: \n";
for(CustomerContract.BillingTerm term : CustomerContract.BillingTerm.values()){
message += " - " + term.toString() + "\n";
}
return message;
}
}
我在 SalesProposal 上遇到编译器错误,因为它试图访问 String
而不是枚举。
令我感到惊讶的是 CustomerContract
没有导致编译器。有人可以向我解释为什么以及我如何明确引用 enum
吗?
请原谅公约问题我做作的例子。
最佳答案
在很多情况下(例如,同名常量的 2 个接口(interface)都由一个类实现),引入命名歧义不会立即影响编译,只要不引用那些歧义的名称,从而导致编译器无法消除歧义。
在您的情况下,问题是定义可迭代对象的 for-each 循环的一部分。
它不是将 CustomerContract.BillingTerm
解释为 enum BilligTerm
,而是将其解释为同名的 String
实例字段,并且可能会提示static
对非 static
成员的引用,忽略了您试图完全引用 enum
的事实。
最佳做法是:
- 不要用嵌套类/枚举的名称隐藏字段名称
- 遵循变量命名conventions并使用
camelBack
作为变量(在这种情况下实际上会达到第 1 点)
关于具有相同名称的 Java 枚举和字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917386/