gpt4 book ai didi

使用枚举重构 Java 方法

转载 作者:搜寻专家 更新时间:2023-10-31 08:23:46 25 4
gpt4 key购买 nike

下面的 getCategory 方法似乎非常多余,我想知道是否有人对重构它有一些建议,可以使用枚举使其更清晰。基于传入的“val”,我需要 getCategory 从 Category 类返回正确的 Category 实例。 Category 类是生成的 JNI 代码,所以我不想更改它。有人有什么想法吗?

要重构的方法:

private Category getCategory(String val) throws Exception{
Category category;
if (val.equalsIgnoreCase("producer")) {
usageCategory = Category.CATEGORY_PRODUCER;
} else if (val.equalsIgnoreCase("meter")) {
usageCategory = Category.CATEGORY_METER;
} else if (val.equalsIgnoreCase("consumer")) {
usageCategory = Category.CATEGORY_CONSUMER;
} else {
throw new Exception("Invalid value: " + val);
}
return usageCategory;
}

Category.java:生成的 JNI(无法更改):

public final class Category {
public final static Category CATEGORY_PRODUCER = new Category("CATEGORY_PRODUCER", SampleJNI.CATEGORY_PRODUCER_get());
public final static Category CATEGORY_METER = new Category("CATEGORY_METER", SampleJNI.CATEGORY_METER_get());
public final static Category CATEGORY_CONSUMER = new Category("CATEGORY_CONSUMER", SampleJNI.CATEGORY_CONSUMER_get());

}

最佳答案

您的方法本质上是从预定的 StringCategory映射,所以为什么不使用 Map反而?具体来说,我推荐 Guava 的 ImmutableMap ,因为这些映射是静态的:

private static final ImmutableMap<String, Category> CATEGORIES_BY_STRING =
ImmutableMap.of(
"producer", Category.CATEGORY_PRODUCER,
"meter", Category. CATEGORY_METER,
"consumer", Category.CATEGORY_CONSUMER
);

或者如果您不想使用第三方库,则采用标准方式:

private static final Map<String, Category> CATEGORIES_BY_STRING;
static {
Map<String, Category> backingMap = new HashMap<String, Category>();
backingMap.put("producer", Category.CATEGORY_PRODUCER);
backingMap.put("meter", Category.CATEGORY_METER);
backingMap.put("producer", Category.CATEGORY_CONSUMER);
CATEGORIES_BY_STRING = Collections.unmodifiableMap(backingMap);
}

您仍然可以使用您的方法来检查无效值(并支持 David Harkness 指出的不区分大小写):

private Category getCategory(String val) {
Category category = CATEGORIES_BY_STRING.get(val.toLowerCase());
if (category == null) {
throw new IllegalArgumentException();
}
return category;
}

关于使用枚举:

如果您可以完全控制传递到 getCategoryString,并且只会传递文字值,那么切换到 确实有意义code>enum 代替。

编辑:以前,我建议使用 EnumMap对于这种情况,但是 Adrian's answer更有意义。

关于使用枚举重构 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10022538/

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