代码之家  ›  专栏  ›  技术社区  ›  Bad Request

为什么不能在Java中保护或公开EnUM构造?

  •  66
  • Bad Request  · 技术社区  · 14 年前

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

    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 修饰符,但如果给定 public protected 修饰语。

    5 回复  |  直到 6 年前
        1
  •  87
  •   jjnguy Julien Chastang    14 年前

    把枚举看作一个实例数量有限的类。除了最初声明的实例之外,不能有任何不同的实例。

    因此,不能有公共或受保护的构造函数,因为这样可以创建更多的实例。

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

        2
  •  18
  •   jjnguy Julien Chastang    14 年前

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

    这是什么 tutorials on Enums 不得不说:

    注: 枚举类型的构造函数必须是package private或private access。它自动创建在枚举体开头定义的常量。不能自己调用枚举构造函数。

        3
  •  8
  •   harto    14 年前

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

        4
  •  0
  •   Praveen Kishor    6 年前

    这是因为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
  •  -1
  •   Rahul Prajapat    8 年前

    要记住的关键点是,没有包含在类中的枚举只能用 公众的 违约 修饰符,就像一个非内部类。