我想知道如何在Java内部实现Enum,并且我正在尝试以下示例
public enum MyEnum {
MyEnum (){
System.out.println("HelloWorld");
}
}
正如上面的那样,我想知道如何调用Myenum()构造函数。
枚举类型的构造函数必须是包装私有化的或私人访问。它会自动创建在枚举主体开头定义的常数。您不能自己调用枚举构造者。
您无法从该枚举外部访问构造函数。您可以通过实际定义枚举常数来访问它。
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);
private final double mass;
private final double radius;
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
}
有关枚举的更多示例,请参见:https://docs.oracle.com/javase/tutorial/java/javaoo/enum.html
java像将java.lang.Enum
作为其基类的类一样实现enum
。它的大部分功能都来自Java编译器的支持,除其他外,该功能确保您不能用操作员new
实例化enum
类,并且enum
值是属性构建的。
如果您想查看MyEnum
的构造函数,请至少添加一个enum
值:
public enum MyEnum {
VALUE1;
MyEnum (){
System.out.println("HelloWorld");
}
}
注意:虽然您还可以使用反射来创建enum
的"非法"实例,但不应在任何类似生产的设置中进行此操作,因为它会破坏有关enum
成员的假设。
enum
s是特殊类,是单胎的概括,为每个常数提供一个实例。在内部,这些字段被视为public static final
,其类型与定义的enum
相同。并且,枚举的构造函数被视为private
,因此您无法从enum MyEnum
外部调用MyEnum()
构造函数。在我们希望将某些属性附加到常数的情况下,使用该构造函数。例如,请考虑以下:
public enum MyEnum {
VAL_A("First Value"),
VAL_B("Second Value");
private final String fullName;
MyEnum(String fullName){
this.fullName = fullName;
}
public String getFullName() {
return fullName;
}
}
那么,我们可以做类似MyEnum.VAL_A.getFullName();
枚举是通过使用类概念在内部实现的。每个枚举常数被隐式地称为公共静态决赛。枚举常数是静态的,因此我们可以使用枚举名称访问它。
例如:
enum Color{
Red,Green,Blue;
}
内部实现为:
final class Color extends java.lang.Enum {
public static final Color Red = new Color ();
public static final Color Green= new Color ();
public static final Color Blue= new Color ();
}
所有枚举常数将在类自动加载时创建,因此,在每个枚举常数的枚举类加载时将执行构造函数。我们无法明确创建枚举对象,因此我们无法直接调用构造函数。