作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
下面的 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());
}
最佳答案
您的方法本质上是从预定的 String
到 Category
的映射,所以为什么不使用 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;
}
关于使用枚举:
如果您可以完全控制传递到 getCategory
的 String
,并且只会传递文字值,那么切换到 确实有意义code>enum
代替。
编辑:以前,我建议使用 EnumMap
对于这种情况,但是 Adrian's answer更有意义。
关于使用枚举重构 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10022538/
我是一名优秀的程序员,十分优秀!