gpt4 book ai didi

Java 枚举自动生成 getInstance 方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:17:39 24 4
gpt4 key购买 nike

假设我有以下 java 枚举

public enum Color {
RED(10),
GREEN(22),
BLUE(33);

private int value;

Color(int value) {
this.value = value;
}

public int intValue() {
return value;
}
}

为了能够通过给定的整数值获得颜色实例,我需要添加如下方法:

public static Color getInstance(int value) {
switch (value) {
case 10: return RED;
case 22: return GREEN;
case 33: return BLUE;
default: throw new IllegalArgumentException("Invalid color value");
}
}

是否可以从 IDE 自动生成此方法? (最好是 IntelliJ)?

最佳答案

不必在每个enum 中重复代码,您可以为具有int 值的所有类型的枚举实现一个中央实用程序方法。这是可能的,因为 enum 可以实现接口(interface),因此您可以定义访问 int 值的统一方式:

public interface IntValued {
int intValue();
}
/** get the particular {@link IntValued} {@code enum} constant. */
public static <T extends Enum<T>&IntValued> T get(Class<T> type, int value) {
return type.cast(GET.get(type).apply(value));
}
private static ClassValue<IntFunction<Enum>> GET = new ClassValue<IntFunction<Enum>>() {
protected IntFunction<Enum> computeValue(Class<?> type) {
return prepare(type);
}
};
// invoked only once per enum type
static IntFunction<Enum> prepare(Class<?> type) {
Enum[] values=type.asSubclass(Enum.class).getEnumConstants();
if(values.length==0) return i -> null;
IntSummaryStatistics s=Arrays.stream(values)
.mapToInt(o -> ((IntValued)o).intValue())
.summaryStatistics();
int min=s.getMin(), max=s.getMax();
if((max-min+1)<s.getCount()*2) {
Enum[] linear=new Enum[max-min+1];
for(Enum e: values) linear[((IntValued)e).intValue()-min]=e;
return i -> i<min||i>max? null: linear[i-min];
}
Map<Integer, Enum> map = Arrays.stream(values).collect(
Collectors.toMap(o -> ((IntValued)o).intValue(), Function.identity()));
return map::get;
}

这使用了 ClassValue,这是 JRE 提供的一种将自定义元数据关联到类的方法。 ClassValue 负责只调用一次初始化代码,并且仍然允许垃圾收集/类卸载。上面的代码动态确定要使用的查找结构。如果特定 enum 类型的 int 值是密集的,它使用数组,否则它求助于 Map

您可以按如下方式使用它:

public enum Color implements IntValued {
RED(10),
GREEN(22),
BLUE(33);

private int value;

Color(int value) {
this.value = value;
}

public int intValue() {
return value;
}
}

Color color=get(Color.class, 22);
System.out.println(color);

请注意,与生成的 switch 语句不同,此解决方案不会在这些 int 值更改时中断。

关于Java 枚举自动生成 getInstance 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32992621/

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