【问题标题】:Why can't enum constructors be protected or public in Java?为什么枚举构造函数不能在 Java 中受到保护或公开?
【发布时间】:2011-04-09 12:13:21
【问题描述】:

整个问题都在标题中。例如:

enum enumTest {

        TYPE1(4.5, "string1"), TYPE2(2.79, "string2");
        double num;
        String st;

        enumTest(double num, String st) {
            this.num = num;
            this.st = st;
        }
    }

构造函数可以使用默认或private 修饰符,但如果给定publicprotected 修饰符,则会出现编译器错误。

【问题讨论】:

    标签: java enums constructor


    【解决方案1】:

    将 Enums 视为具有有限数量实例的类。除了您最初声明的实例之外,永远不会有任何不同的实例。

    因此,您不能拥有公共或受保护的构造函数,因为这将允许创建更多实例。

    注意:这可能不是官方的原因。但对我来说,这样想enums 是最有意义的。

    【讨论】:

    • 这确实很有意义。但是为什么要允许“默认”呢?因为同一个包中的其他类也可以调用构造函数。
    • @Anita 查看丹尼尔的回答。 “你不能自己调用​​枚举构造函数。”
    • @Anita,所有接口方法都是公共和抽象的......所以在接口 Runnable ( void run ( ) ; } 中,run 方法是公共的和抽象的。也许 java 设计者对 enum 做了同样的事情构造函数(无论您是否将它们标记为私有,它们都是私有的)。
    • 实际上枚举构造函数只允许私有访问修饰符。 “如果没有为枚举类型的构造函数指定访问修饰符,则构造函数是私有的。” - JLSdocs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.3
    • 枚举类的所有构造函数都是隐式私有的,即使省略了 private 修饰符。
    【解决方案2】:

    因为你不能自己调用​​构造函数。

    这是tutorials on Enums 必须说的话:

    注意:枚举类型的构造函数必须是包私有或私有访问。它会自动创建在枚举体开头定义的常量。您不能自己调用​​枚举构造函数。

    【讨论】:

    • 取自Daniel提供的链接“注意:枚举类型的构造函数必须是包私有或私有访问。它会自动创建在枚举主体开头定义的常量。你不能自己调用一个枚举构造函数。”既然你不能自己调用​​它,为什么它可以是包私有的并不重要。
    • 但另一方面,这个限制并不能真正解释为什么我们不能有公共或受保护的枚举构造函数。允许四个访问修饰符中的两个访问修饰符有点奇怪和不一致;允许所有访问修饰符(因为你仍然不能调用构造函数)或只允许一个(最佳候选者是private - 指出这不能从其他地方访问 - 或者可能是默认值会更有意义, 以减少代码噪音)。
    • @gustafc:完全是我的观点!
    【解决方案3】:

    枚举包含一组固定的值,这些值在编译时都必须是已知的。在运行时创建新的文字是没有意义的,如果构造函数是可见的,这将是可能的。

    【讨论】:

      【解决方案4】:

      这是因为 enum 是 Java 包含的固定常量值。因此,拥有公共或受保护的构造函数是没有意义的,因为您无法创建枚举实例。

      另外,请注意,内部枚举被转换为类,如下所示。

      enum Color {
       RED, BLUE, YELLOW;
      }
      

      这将在内部转换为:

      public final class Color {
       private Color() {}
       public static final Color RED = new Color();
       public static final Color BLUE = new Color();
       public static final Color YELLOW = new Color();
      }
      

      因此,每个枚举常量都表示为枚举类型的对象。由于我们不能显式创建枚举对象,因此我们不能直接调用枚举构造函数。

      【讨论】:

        【解决方案5】:

        要记住的关键点是,未包含在类中的枚举只能使用 publicdefault 修饰符声明,就像非内部类。

        【讨论】:

        • 同样,这个问题是关于枚举构造函数,而不是枚举类型本身。
        猜你喜欢
        • 2020-09-17
        • 1970-01-01
        • 2010-10-20
        • 2013-08-04
        • 2011-05-30
        • 2021-05-30
        • 2012-01-19
        • 2019-11-18
        • 1970-01-01
        相关资源
        最近更新 更多