Basil Bourque 的回答很好,但我不喜欢使用ordinal(),因为你可以很容易地旋转enum 常量并且会破坏业务逻辑。
您几乎是正确的,请记住,enum 常量是一个普通的旧 java class 实例,它可以通过附加功能进行扩展。因此,最好将所有映射器逻辑隐藏在 enum 中。
public enum ExternalEnum {
EXTERNAL_CAR,
EXTERNAL_VAN,
EXTERNAL_BUS
}
public enum InternalEnum {
CAR(ExternalEnum.EXTERNAL_CAR),
VAN(ExternalEnum.EXTERNAL_VAN),
BUS(ExternalEnum.EXTERNAL_BUS);
private final ExternalEnum externalEnum;
InternalEnum(ExternalEnum externalEnum) {
this.externalEnum = externalEnum;
}
public ExternalEnum toExternal() {
return externalEnum;
}
public static Optional<InternalEnum> parseExternal(ExternalEnum externalEnum) {
for (InternalEnum internalEnum : values())
if (internalEnum.externalEnum == externalEnum)
return Optional.of(internalEnum);
return Optional.empty();
}
}
演示
ExternalEnum externalEnum = ExternalEnum.EXTERNAL_CAR;
Optional<InternalEnum> optInternalEnum = InternalEnum.parseExternal(externalEnum);
System.out.println(externalEnum);
System.out.println(optInternalEnum.orElse(null));
System.out.println(optInternalEnum.map(InternalEnum::toExternal).orElse(null));
另一种方法是只有Mapper
public final class EnumMapper {
private final Map<ExternalEnum, InternalEnum> MAP_EXT_INT = Map.of(
ExternalEnum.EXTERNAL_CAR, InternalEnum.CAR,
ExternalEnum.EXTERNAL_VAN, InternalEnum.VAN,
ExternalEnum.EXTERNAL_BUS, InternalEnum.BUS);
private final Map<InternalEnum, ExternalEnum> MAP_INT_EXT = Map.of(
InternalEnum.CAR, ExternalEnum.EXTERNAL_CAR,
InternalEnum.VAN, ExternalEnum.EXTERNAL_VAN,
InternalEnum.BUS, ExternalEnum.EXTERNAL_BUS);
public static ExternalEnum toExternal(InternalEnum internalEnum) {
return MAP_INT_EXT.get(internalEnum);
}
public InternalEnum toInternal(ExternalEnum externalEnum) {
return MAP_EXT_INT.get(externalEnum);
}
private EnumMapper() {}
}
public enum ExternalEnum {
EXTERNAL_CAR,
EXTERNAL_VAN,
EXTERNAL_BUS
}
public enum InternalEnum {
CAR,
VAN,
BUS;
}