在Java中分配枚举值

时间:2016-10-17 20:20:46

标签: java enums

如果我有两个枚举,请说:

public enum E1 {
    A, B
}

public enum E2 {
    A, B
}

有没有办法可以将枚举类型E2的值赋给E1类型的值,如下所示:

E2 var = E1.B;

(假设我事先知道B存在于两个枚举中)

修改

我知道Java并不允许这样做。也许我应该解释一下。我有一个枚举E1 的变量(x)(它可以是A或B)。对于我想要实现的任务,我需要使用相同值的另一个枚举E2 变量。我现在处理这个问题的方式基本上是:

if (x == E1.A) {
    E2 var = E2.A;
} else {
    E2 var = E2.B;
}

所以我想我问的是,有没有更好的方法呢?

6 个答案:

答案 0 :(得分:3)

E1E2是两种不同的枚举类型。想象一下,你正在开发一个纸牌游戏应用程序,你有一个套件的枚举和Rank的枚举。您提出的要求相当于试图说明一张卡片的Rank.TEN套件或等级Suite.HEARTS。它只是没有意义,而不是枚举的工作方式。

答案 1 :(得分:2)

如果让两个枚举实现相同的接口,则可以间接执行此操作:

interface CommonEnumInterface{}

public enum E1 implements  CommonEnumInterface{
A, B
} 

public enum E2 implements  CommonEnumInterface{
C, D
}

CommonEnumInterface myE  = E1.A;
myE  = E2.D;

答案 2 :(得分:0)

上面评论的答案是,你不能这样做。

Java中的枚举是类型安全的,并且有自己的命名空间。这意味着你的枚举将有一个类型,例如"货币"并且您不能分配除枚举常量中指定的值以外的任何值。 E1为E1,E2为E2命名空间。

答案 3 :(得分:0)

好好看看你的第二个片段,你可以做的是将E2定义为

enum E2 {
    A, B
}

E1

enum E1 {

    A(E2.A), B(E2.B);

    private E2 e2;

    E1(E2 e2) {
        this.e2 = e2;
    }

    public E2 getE2() {
        return e2;
    }

}
像这样,您只需将if声明写为

即可
E2 var = x.getE2();

这个解决方案背后的想法是,与Java中的任何其他类一样,枚举可以具有属性(private E2 e2),构造函数(E1(E2 es) {...})和方法(public E2 getE2())。就像那样你可以"添加"枚举实例的任何其他值,并使用getter稍后查询它们。

答案 4 :(得分:0)

简短的回答是NO,java不允许

我需要更多关于你究竟需要做什么的信息,但你可以做类似的事情

public static void main(String[] args) {

    E2 myE2 = E2.valueOf(E1.A.name());
    System.out.println(myE2);
    }

    enum E1 {
    A, B
    }

    enum E2 {
    A, B
    }

并注意这只会起作用,因为字段A在两个枚举中定义,否则无法使用java.lang.IllegalArgumentException: No enum constant ...

失败

但是这种解决方法正是您在说

时发布的内容
  

(假设我事先知道B存在于两个枚举中)

答案 5 :(得分:0)

由于您可以将enums定义为'轻量级类'使用自己的属性和方法符合接口,您可以编写如下的组合规则:

Upholstery.java

import java.util.List;

public interface Upholstery {

    public List<Material> combinesWith();

}

Material.java

import java.util.List;

public interface Material {

    public List<Upholstery> combinesWith();
}

Upholsteries.java

import java.util.Arrays;
import java.util.List;

public enum Upholsteries implements Upholstery {
    SATIN {
        @Override
        public List<Material> combinesWith() {
            return Arrays.asList(Materials.PLASTIC);
        }
    },
    LEATHER {
        @Override
        public List<Material> combinesWith() {
            return Arrays.asList(Materials.MAHOGANY);
        }
    }
}

Materials.java

import java.util.Arrays;
import java.util.List;

public enum Materials implements Material {
    MAHOGANY {
        @Override
        public List<Upholstery> combinesWith() {
            return Arrays.asList(Upholsteries.SATIN,
                                 Upholsteries.LEATHER);
        }
    },
    PLASTIC {
        @Override
        public List<Upholstery> combinesWith() {
             return Arrays.asList(Upholsteries.SATIN);
        }
    }
}

显然,您可以向接口添加其他方法,或修改combinesWith()的签名以实现更复杂的逻辑 - 例如combinesWith(FurnitureType f, double budget)