在Java中分配枚举值
如果我有两个枚举,请说:在Java中分配枚举值,java,enums,Java,Enums,如果我有两个枚举,请说: public enum E1 { A, B } public enum E2 { A, B } 是否有任何方法可以将枚举类型E2的值分配给类型E1的值,如下所示: E2 var = E1.B; (假设我事先知道两个枚举中都存在B) 编辑: 我知道Java不允许这样做。也许我也应该解释一下。我有一个类型为enum E1的变量(x)(可以是a或B)。对于我试图完成的任务,我需要另一个类型为enum E2且值相同的变量。我现在处理这个问题的方式基本上是:
public enum E1 {
A, B
}
public enum E2 {
A, B
}
是否有任何方法可以将枚举类型E2的值分配给类型E1的值,如下所示:
E2 var = E1.B;
(假设我事先知道两个枚举中都存在B)
编辑:
我知道Java不允许这样做。也许我也应该解释一下。我有一个类型为enum E1的变量(x)(可以是a或B)。对于我试图完成的任务,我需要另一个类型为enum E2且值相同的变量。我现在处理这个问题的方式基本上是:
if (x == E1.A) {
E2 var = E2.A;
} else {
E2 var = E2.B;
}
因此,我想我要问的是,有没有更好的方法可以做到这一点?如果让两个enum实现相同的接口,您可以间接做到这一点:
interface CommonEnumInterface{}
public enum E1 implements CommonEnumInterface{
A, B
}
public enum E2 implements CommonEnumInterface{
C, D
}
CommonEnumInterface myE = E1.A;
myE = E2.D;
如果让两个枚举实现相同的接口,则可以间接执行此操作:
interface CommonEnumInterface{}
public enum E1 implements CommonEnumInterface{
A, B
}
public enum E2 implements CommonEnumInterface{
C, D
}
CommonEnumInterface myE = E1.A;
myE = E2.D;
是的,如上所述,答案是你不能这样做
Java中的枚举是类型安全的,并且有自己的命名空间。这意味着您的枚举将有一个类型,例如“Currency”,并且除了在枚举常量中指定的值之外,您不能分配任何值。E1是E1,E2是E2名称空间。是的,正如上面所评论的,答案是你不能这样做 Java中的枚举是类型安全的,并且有自己的命名空间。这意味着您的枚举将有一个类型,例如“Currency”,并且除了在枚举常量中指定的值之外,您不能分配任何值。E1是E1,E2是E2命名空间。否。
E1
和E2
是两种不同的枚举类型。假设您正在开发一个纸牌游戏应用程序,您有一个用于Suite的枚举和一个用于Rank的枚举。你所问的相当于试图说一张卡片可以有一组Rank.TEN
或一组Suite.HEARTS
。这毫无意义,也不是枚举的工作方式。否。
E1
和E2
是两种不同的枚举类型。假设您正在开发一个纸牌游戏应用程序,您有一个用于Suite的枚举和一个用于Rank的枚举。你所问的相当于试图说一张卡片可以有一组Rank.TEN
或一组Suite.HEARTS
。它毫无意义,也不是枚举的工作方式。好吧,看看你的第二个代码片段,你能做的就是将E2
定义为
enum E2 {
A, B
}
和E1
as
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
)、构造函数(E1(E2 es){…}
)和方法(public E2 getE2()
)。这样,您就可以将任何其他值“添加”到枚举实例中,并在以后使用getter查询它们。看看您的第二个代码片段,您可以将E2
定义为
enum E2 {
A, B
}
和E1
as
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
)、构造函数(E1(E2 es){…}
)和方法(public E2 getE2()
)。这样,您就可以将任何其他值“添加”到枚举实例中,并在以后使用getter查询它们。简单的回答是否,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)
简单的回答是不,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)
由于您可以将
enum
定义为符合具有自己属性和方法的接口的“轻量级类”,因此您可以编写如下组合规则:
E2 var = E1.B;
内饰.java
import java.util.List;
public interface Upholstery {
public List<Material> combinesWith();
}
import java.util.List;
公共界面装潢{
公共列表与()组合;
}
Material.java
import java.util.List;
public interface Material {
public List<Upholstery> combinesWith();
}
import java.util.List;
公共界面材料{
公共列表与()组合;
}
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);
}
}
}
导入java.util.array;
导入java.util.List;
公共枚举室内装潢实现室内装潢{
绸缎{
@凌驾
公共列表combinesWith(){
返回阵列。asList(材料。塑料);
}
},
皮革{
@凌驾
公共列表combinesWith(){
返回数组.asList(材料.桃花心木);
}
}
}
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);
}
}
}
导入java.util.array;
导入java.util.List;
公共枚举材质实现材质{
桃花心木{
@凌驾
公共列表combinesWith(){
返回阵列。asList(室内装潢),
室内装潢(皮革);
}
},
塑料制品{
@凌驾
公共列表combinesWith(){
返回阵列.asList(室内装潢.缎面);
}
}
}
显然,您可以向接口添加其他方法,或者修改
combinesWith()
的签名以实现更复杂的逻辑-例如combinesWith(家具类型f,双预算)
,因为您可以将enum
定义为符合具有自己属性和方法的接口的“轻量级类”