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

标签 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 吗?

请原谅公约问题我做作的例子。

最佳答案

在很多情况下(例如,同名常量的 2 个接口(interface)都由一个类实现),引入命名歧义不会立即影响编译,只要不引用那些歧义的名称,从而导致编译器无法消除歧义。

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

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

最佳做法是:

  • 不要用嵌套类/枚举的名称隐藏字段名称
  • 遵循变量命名conventions并使用 camelBack 作为变量(在这种情况下实际上会达到第 1 点)

关于具有相同名称的 Java 枚举和字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917386/

相关文章:

java - 从java发送电子邮件

java - 类引用取自不同的 jar

java - 如果状态成功,则还阻止在 android 中执行

c++ - 类范围的枚举

c# - Silverlight 3/Prism - 将枚举值作为命令参数传递

c++ - 在 constexpr 分支中使用枚举类值

java - 无法实例化java中的类型

JavaCV FFmpegFrameRecorder 视频输出偏红颜色

typescript - 是否可以存储包含对象的枚举?

java - 从某种类型的对象列表中返回匹配的对象