我在项目工作期间在存储库中发现了这种类型的代码。 该存储库运行良好......但是当我试图通过独立的测试运行来理解代码时...给出错误!!!
public enum Fruits {
static {
APPLE= new Fruits( "APPLE", 0 );
BANANA = new Fruits( "BANANA", 1 );
// and so on.
}
}
我无法理解在enum中调用枚举的构造函数的含义,也没有声明构造函数。
答案 0 :(得分:6)
我的猜测是,实际上是反编译实际代码的产物。这不是有效的Java源代码,但实际上是编译器将为您创建的枚举:
public enum Fruits {
APPLE, BANANA;
}
答案 1 :(得分:4)
像往常一样@ JonSkeets的直觉胜出。编译他提供的代码:
public enum Fruits {
APPLE, BANANA;
}
然后用jad
反编译产生:
public final class Fruits extends Enum
{
public static Fruits[] values()
{
return (Fruits[])$VALUES.clone();
}
public static Fruits valueOf(String s)
{
return (Fruits)Enum.valueOf(Fruits, s);
}
private Fruits(String s, int i)
{
super(s, i);
}
public static final Fruits APPLE;
public static final Fruits BANANA;
private static final Fruits $VALUES[];
static
{
APPLE = new Fruits("APPLE", 0);
BANANA = new Fruits("BANANA", 1);
$VALUES = (new Fruits[] {
APPLE, BANANA
});
}
}
完整的示例说明了在声明枚举时编译器正在为您做的所有工作。请注意,正如@MarkoTopolnik指出的那样,你不能自己做,只是因为编译器不允许这样做。
答案 2 :(得分:-1)
public enum Fruits {
APPLE("APPLE", 0 ), BANANA("BANANA", 1 );
String text;
int value;
private Fruits(String text, int value){
this.text = text;
this.value = value;
}
public String getText(){
return text;
}
public int getValue(){
return value;
}
}
当您希望添加更多参数时,此概念非常有用。