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个值-请参阅上的注释。