为什么不能在Java中保护枚举构造函数或公开?

时间:2010-09-08 01:46:43

标签: java enums constructor

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

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修饰符,则会给出编译器错误。

5 个答案:

答案 0 :(得分:88)

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

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

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

答案 1 :(得分:19)

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

以下是tutorials on Enums所说的内容:

  

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

答案 2 :(得分:8)

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

答案 3 :(得分:0)

这是因为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();
}

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

答案 4 :(得分:-1)

要记住的关键点是,未包含在类中的枚举可以仅使用公共默认修饰符声明,就像非内部类。