【发布时间】:2013-03-31 20:33:26
【问题描述】:
我试图了解 Java 枚举的真正工作原理,我得出的结论是,它与将构造函数声明为私有的普通 Java 类非常相似。
我刚刚得出这个结论,并没有经过太多思考,但我想知道我是否错过了什么。
所以下面是一个简单的 Java 枚举和一个等效的 Java 类的实现。
public enum Direction {
ENUM_UP(0, -1),
ENUM_DOWN(0, 1),
ENUM_RIGHT(1, 0),
ENUM_LEFT(-1, 0);
private int x;
private int y;
private Direction(int x, int y){
this.x = x;
this.y = y;
}
public int getEnumX(){
return x;
}
public int getEnumY(){
return y;
}
}
上面和下面的代码在含义上有什么区别?
public class Direction{
public static final Direction UP = new Direction(0, -1) ;
public static final Direction DOWN = new Direction(0, 1) ;
public static final Direction LEFT = new Direction(-1, 0) ;
public static final Direction RIGHT = new Direction(1, 0) ;
private int x ;
private int y ;
private Direction(int x, int y){
this.x = x ;
this.y = y ;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
}
【问题讨论】:
-
好问题,它们在很多方面确实相似 :) 也有很多不同之处,我相信这里会有很好的答案。
-
我能想到的至少三个区别:[1] 你将无法切换后一个实现(即
Direction d; switch(d)),[2]Direction.toString()实现将是不同,[3] enum 方法允许您通过.values()获取“类”的所有实例,而类方法则不能。 -
你将失去
values()、valueOf()和ordinal()。 -
Enum 是一种增强的构建到语言。表达一些东西,它更短更清晰。您可以以 Scala 为例:Scala 在语言中构建了许多您必须用纯 Java 中的大量样板代码来表达的东西。以单身人士为例。 Java 在这方面非常(极端)保守。
-
投票重新开放。如果有的话,other question 应该作为它的副本关闭,因为它更清晰并且有更好的答案。
标签: java enums enumeration