Java枚举和具有相同名称的字段

时间:2016-10-07 12:31:38

标签: java enums

我最近重构了一些代码并最终出现了一个奇怪的编译器错误

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

请原谅我的惯例。

1 个答案:

答案 0 :(得分:3)

在许多情况下(例如2个具有同名常量的接口都由类实现),引入命名歧义不会立即影响编译,只要这些不明确的名称未被引用,从而导致编译器无法歧义。

在您的情况下,问题是定义可迭代的for-each循环的一部分。

不是将CustomerContract.BillingTerm解释为enum BilligTerm,而是将其解释为同名String实例字段,并且可能会抱怨static对非static的引用{1}}成员,忽略了您尝试完全引用enum的事实。

最佳做法是:

  • 不使用嵌套类/枚举名称
  • 遮蔽字段名称
  • 遵循变量命名conventions并使用camelBack作为变量(在这种情况下事实上将达到第1点)