2012-07-24 78 views
4

我必须使用开关来获取枚举的值。枚举是这一个:得到枚举.values()[]或创建枚举数组?

public enum Compass {  NORTH, SOUTH, EAST, WEST;  } 

而且我这样做(在枚举外的其他类):

Compass.values()[0].name() 

但书上说,要做到这一点的方法是:

Compass[] comp = { Compass.NORTH, Compass. SOUTH, Compass.EAST, Compass.WEST } 
comp[0].name(); 

它们中的任何一个都比另一个更好?我的意思是,创建一个枚举“对象”或更多东西更稳定?

+0

每种方法都有其优点和缺点 - 主要显示枚举被修改时的情况。 – nhahtdh 2012-07-24 06:56:15

+0

*“我必须使用开关来获取枚举的值。”*您能显示该开关的代码吗?为什么你需要一个阵列对我来说似乎并不明显。 – assylias 2012-07-24 07:21:27

回答

3

为了获得直接的枚举值之一的名称,而不使用数组,你可以这样做:

Compass.NORTH.name(); 

通过Compass.values()返回的数组在枚举声明的顺序,所以除非你不喜欢声明的命令(并且不能改变它),否则你不担心别人会改变命令(例如插入一个新值)并破坏你的代码。

尽管如此,您希望避免重复,因为这意味着要维护两件事而不是一件事,而且事情很容易失去同步。如果有人添加了NORTH_EAST,SOUTH_WEST等,您必须记得更新您的数组以适应这些值,或者发现在某些情况下您的代码可能不起作用。

3

如果你做Compass.values();你的值返回的顺序将是它们写入Enum类的顺序。如果你的代码依赖于数组内容的顺序,那么最好像你的例子一样创建你自己的数组,并且在你需要的地方控制顺序。

如果您只想获得此枚举的特定值(例如NORTH),则只需编写Compass.NORTH.name();而不是使用数组。