gpt4 book ai didi

java - 在 Java 中用更少的代码将枚举映射到另一个枚举

转载 作者:行者123 更新时间:2023-12-04 12:31:15 25 4
gpt4 key购买 nike

我有两个枚举类,一个是外部的,另一个是内部的。

public enum ExternalEnum
{
EXTERNAL_CAR, EXTERNAL_VAN, EXTERNAL_BUS
}

public enum InternalEnum
{
CAR, VAN, BUS
}

我需要将内部映射到外部,将外部映射到内部。所以我做了以下,

public class EnumMapper
{
public ExternalEnum toExternal(InternalEnum internalEnum)
{
switch (internalEnum)
{
case BUS:
return ExternalEnum.EXTERNAL_BUS;
case CAR:
return ExternalEnum.EXTERNAL_CAR;
case VAN:
return ExternalEnum.EXTERNAL_VAN;
}
return null;
}

public InternalEnum toInternal(ExternalEnum externalEnum)
{
switch (externalEnum)
{
case EXTERNAL_BUS:
return InternalEnum.BUS;
case EXTERNAL_CAR:
return InternalEnum.CAR;
case EXTERNAL_VAN:
return InternalEnum.VAN;
}
return null;
}
}

所以同一种映射在两种方法中重复。有没有一种使用更少代码量来实现此目的的好方法?

最佳答案

tl;dr

InternalEnum.values()[ externalEnum.ordinal() ]

详情

假设等效的枚举对象以相同的顺序声明,我们可以通过访问从调用隐式 public static T[] values() 返回的所有枚举对象的数组来从另一个枚举对象中检索一个 方法(参见 this Question )并通过从错误命名的 Enum#ordinal 检索到的从零开始的索引号进行访问方法。

例如,InternalEnum.values() 按声明顺序返回所有枚举对象的数组。然后我们使用数组访问器 […] 来检索与另一个枚举中其伙伴的索引号匹配的对象。

InternalEnum internalEnum = InternalEnum.values()[ externalEnum.ordinal() ] ;

反之亦然:

ExternalEnum externalEnum = ExternalEnum.values()[ internalEnum.ordinal() ] ;

这是示例用法。额外提示:在 Java 16+ 中,我们可以在本地声明一个枚举——参见 JEP 395: Records .

enum ExternalEnum { EXTERNAL_CAR, EXTERNAL_VAN, EXTERNAL_BUS }
enum InternalEnum { CAR, VAN, BUS }

System.out.println(
InternalEnum.values()[ ExternalEnum.EXTERNAL_VAN.ordinal() ]
);

System.out.println(
ExternalEnum.values()[ InternalEnum.VAN.ordinal() ]
);

VAN

EXTERNAL_VAN

关于java - 在 Java 中用更少的代码将枚举映射到另一个枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68901678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com