Java:我可以在一个枚举中使用两个不同的名称来计算同一事物吗?
我有一个带有基本方向(北、东、南、西)的枚举类: 有没有一种方法可以为同一件事使用多个名称?例如,类似这样的事情:Java:我可以在一个枚举中使用两个不同的名称来计算同一事物吗?,java,enums,namespaces,elements,equivalent,Java,Enums,Namespaces,Elements,Equivalent,我有一个带有基本方向(北、东、南、西)的枚举类: 有没有一种方法可以为同一件事使用多个名称?例如,类似这样的事情: public enum Direction { NORTH or N, EAST or E, SOUTH or S, WEST or W; } 实际上,我想要的是能够对一个变量N或NORTH进行签名,并使这两个操作完全相同 例如: Direction direction1=new Direction.NORTH; Direction directi
public enum Direction {
NORTH or N,
EAST or E,
SOUTH or S,
WEST or W;
}
实际上,我想要的是能够对一个变量N或NORTH进行签名,并使这两个操作完全相同
例如:
Direction direction1=new Direction.NORTH;
Direction direction2=new Direction.N;
//direction1==direction2
是合法的,但是“N”
将不适用于自动生成的valueOf
方法。也就是说,Direction.valueOf(“N”)
将抛出一个illegargumentexception
而不是返回Direction.NORTH
您也不能写入案例N:
。您必须使用开关
es中的全名,其值为方向
除此之外,缩写形式应该和完整版本一样有效。您可以在
EnumSet
s中使用Direction.N
,比较它是否相等Direction.N==Direction.NORTH
,获取它的name()
(即“NORTH”
),导入静态包。Direction.N代码>,等等。您可以这样做(东、西省略)
那么你可以做这样的事情
public void foo(Direction arg) {
Direction d = arg.getDirection();
}
然后,您将始终只处理北、南、东和西。嗯,可能有一个“客户端枚举”,其中的变量包含实际的“有意义的枚举”
有点过分,但您可以向客户机代码公开方向,并使用
getBaseDirection
进行实际逻辑 1+。我没想过。但是N==NORTH
将返回false。这意味着您必须始终记住使用getDirection()
,这很麻烦,而且会使代码变得脆弱。。。“而且可能比您添加N
作为缩写之前更加冗长了。”斯蒂芬同意。这不是一个理想的解决方案,只是一个“A”解决方案。如果您希望:N==NORTH这样的值为真,则需要做更多的工作。问题是N!=北方。您需要使用equals
比较方向值,并且开关(方向){…}
需要同时使用这两个选项。这有点违背了使用枚举的目的。
public enum Direction {
NORTH,
EAST,
SOUTH,
WEST,
;
// Convenience names.
public static final Direction N = NORTH;
public static final Direction E = EAST;
public static final Direction S = SOUTH;
public static final Direction W = WEST;
}
public enum Direction {
NORTH {
@Override
Direction getDirection() {
return NORTH;
}
},
N {
@Override
Direction getDirection() {
return NORTH;
}
},
SOUTH {
@Override
Direction getDirection() {
return SOUTH;
}
},
S {
@Override
Direction getDirection() {
return SOUTH;
}
} ;
abstract Direction getDirection();
}
public void foo(Direction arg) {
Direction d = arg.getDirection();
}
public enum Direction {
NORTH(BaseDirection.NORTH),
N(BaseDirection.NORTH),
EAST(BaseDirection.EAST),
E(BaseDirection.EAST),
SOUTH(BaseDirection.SOUTH),
S(BaseDirection.SOUTH),
WEST(BaseDirection.WEST),
W(BaseDirection.WEST);
private BaseDirection baseDirection;
private Direction(BaseDirection baseDirection) {
this.baseDirection = baseDirection;
}
public BaseDirection getBaseDirection() {
return baseDirection;
}
}
public enum BaseDirection {
NORTH,
EAST,
SOUTH,
WEST;
}