Java 启动枚举作为值
我想将枚举变量声明为值。我怎样才能做到这一点 例如:Java 启动枚举作为值,java,enums,Java,Enums,我想将枚举变量声明为值。我怎样才能做到这一点 例如: public enum CardSuit { SPADE(0), HEART(1), DIAMOND(2), CLUB(3); } 我可以这样声明: CardSuit s = CardSuit.SPADE; 我也想这样声明: CardSuit s = 1; 这样做的方法是什么?这可能吗 我想你想要这样的东西 public static enum CardSuit { SPADE(0), HEART(1), DIAMOND(
public enum CardSuit {
SPADE(0), HEART(1), DIAMOND(2), CLUB(3);
}
我可以这样声明:
CardSuit s = CardSuit.SPADE;
我也想这样声明:
CardSuit s = 1;
这样做的方法是什么?这可能吗 我想你想要这样的东西
public static enum CardSuit {
SPADE(0), HEART(1), DIAMOND(2), CLUB(3);
int value;
CardSuit(int v) {
this.value = v;
}
public String toString() {
return this.name();
}
}
public static void main(String[] args) {
CardSuit s = CardSuit.values()[0];
System.out.println(s);
}
输出为
SPADE
CLUB
编辑
如果您想按指定的值进行搜索,您可以使用类似的方法-
public static enum CardSuit {
SPADE(0), HEART(1), DIAMOND(4), CLUB(2);
int value;
CardSuit(int v) {
this.value = v;
}
public String toString() {
return this.name();
}
public static CardSuit byValue(int value) {
for (CardSuit cs : CardSuit.values()) {
if (cs.value == value) {
return cs;
}
}
return null;
}
}
public static void main(String[] args) {
CardSuit s = CardSuit.byValue(2);
System.out.println(s);
}
输出为
SPADE
CLUB
您可以提供工厂方法:
public enum CardSuit {
SPADE(0), HEART(1), DIAMOND(2), CLUB(3);
private final int value;
CardSuit(int value) { this.value = value; }
public static CardSuit of(int value) {
for (CardSuit cs : values()) {
if (cs.value == value) return cs;
}
throw new IllegalArgumentException("not a valid value: " + value);
}
}
public static void main(String[] args) {
CardSuit s = CardSuit.of(0);
System.out.println(s);
}
您可以使用值和相应的枚举保留一个映射
public enum CardSuit {
SPADE(0), HEART(1), DIAMOND(2), CLUB(3);
private CardSuit(int i) {
value = i;
}
public int getValue() {
return value;
}
private int value;
private static Map<Integer, CardSuit> getByValue = new HashMap<Integer, CardSuit>();
public static CardSuit findByValue(int value) {
if (getByValue.isEmpty()) {
for (CardSuit cardSuit : CardSuit.values()) {
getByValue.put(cardSuit.getValue(), cardSuit);
}
}
return getByValue.get(value);
}
}
维护一个映射而不是每次遍历整个值,这不会对性能造成很大影响,但仍然可以吗?@Karna对于数量更多的枚举常量来说,这是有意义的,但在这种情况下,映射实际上可能会更慢,因为您必须将int转换为Integer,获取哈希代码,重新哈希,计算一个模,然后访问一个数组,而如果使用普通for循环,则最多只能进行4次比较和一次数组访问。如何维护一个映射,而不是每次遍历整个值,这不会对性能造成很大影响,但仍然可以?非常感谢。成功了。虽然我试着用switch…case来解决问题。你的更好。@Karna克努特。@ElliottFrisch不错的链接。“看来我在考虑优化问题了。”杰伦·范内维尔,谢谢你的编辑。因为这是我的第一篇文章,我有点搞砸了。静态功能必须是必需的。更新的一个效果很好。我喜欢使用地图的想法。在这种枚举的早期版本中,我会直接遍历枚举值。非常确定性能差异将是最小的。如果多个线程连续快速调用findByValue,是否存在同步问题?@sfosdal yup。另外,
Map
有点浪费,有4个值-请参阅上的注释。