消除重复的枚举代码 [英] eliminating duplicate Enum code
问题描述
我有大量枚举实现这个界面:
/ **
*枚举,每个元素可以通过代码唯一标识
* /
public interface CodableEnum {
/ **
*获取具有特定代码的元素
* @param code
* @return
* /
public CodableEnum getByCode(String code);
/ **
*获取标识枚举元素的代码
* @return
* /
public String getCode();
}
一个典型的例子是:
$ b $公开枚举IMType实现CodableEnum {
MSN_MESSENGER(msn_messenger),
GOOGLE_TALK(google_talk),
SKYPE (skype),
YAHOO_MESSENGER(yahoo_messenger);
private final String code;
IMType(String code){
this.code = code;
}
public String getCode(){
return code;
public IMType getByCode(String code){
for(IMType e:IMType.values()){
if(e.getCode()。equalsIgnoreCase (代码)){
return e;
}
}
}
}
As您可以想象这些方法在CodableEnum的所有实现中几乎相同。我想消除这个重复,但坦白地说不知道如何。我尝试使用如下的类:
public abstract class DefaultCodableEnum implements CodableEnum {
private final String代码;
DefaultCodableEnum(String code){
this.code = code;
}
public String getCode(){
return this.code;
}
public abstract CodableEnum getByCode(String code);
}
但事实证明是相当无用的,因为:
- 枚举不能扩展类
- 枚举元素(SKYPE,GOOGLE_TALK等)不能扩展类
- 我不能提供getByCode()的默认实现,因为DefaultCodableEnum本身不是枚举。我尝试更改DefaultCodableEnum以扩展java.lang.Enum,但这似乎不允许。
任何不会建议靠反思?
谢谢,
Don
您可以将重复的代码设为 CodeableEnumHelper
class:
public class CodeableEnumHelper {
public static CodeableEnum getByCode(String code, CodeableEnum []值){
for(CodeableEnum e:values){
if(e.getCode()。equalsIgnoreCase(code)){
return e;
}
}
返回null;
}
}
每个 CodeableEnum
类仍然需要实现一个 getByCode
方法,但该方法的实际实现至少已经集中到一个地方。
public enum IMType实现CodeableEnum {
...
public IMType getByCode(String code){
return(IMType )CodeableEnumHelper.getByCode(code,this.values());
}
}
I have a large number of Enums that implement this interface:
/**
* Interface for an enumeration, each element of which can be uniquely identified by it's code
*/
public interface CodableEnum {
/**
* Get the element with a particular code
* @param code
* @return
*/
public CodableEnum getByCode(String code);
/**
* Get the code that identifies an element of the enum
* @return
*/
public String getCode();
}
A typical example is:
public enum IMType implements CodableEnum {
MSN_MESSENGER("msn_messenger"),
GOOGLE_TALK("google_talk"),
SKYPE("skype"),
YAHOO_MESSENGER("yahoo_messenger");
private final String code;
IMType (String code) {
this.code = code;
}
public String getCode() {
return code;
}
public IMType getByCode(String code) {
for (IMType e : IMType.values()) {
if (e.getCode().equalsIgnoreCase(code)) {
return e;
}
}
}
}
As you can imagine these methods are virtually identical in all implementations of CodableEnum. I would like to eliminate this duplication, but frankly don't know how. I tried using a class such as the following:
public abstract class DefaultCodableEnum implements CodableEnum {
private final String code;
DefaultCodableEnum(String code) {
this.code = code;
}
public String getCode() {
return this.code;
}
public abstract CodableEnum getByCode(String code);
}
But this turns out to be fairly useless because:
- An enum cannot extend a class
- Elements of an enum (SKYPE, GOOGLE_TALK, etc.) cannot extend a class
- I cannot provide a default implementation of getByCode(), because DefaultCodableEnum is not itself an Enum. I tried changing DefaultCodableEnum to extend java.lang.Enum, but this doesn't appear to be allowed.
Any suggestions that do not rely on reflection? Thanks, Don
You could factor the duplicated code into a CodeableEnumHelper
class:
public class CodeableEnumHelper {
public static CodeableEnum getByCode(String code, CodeableEnum[] values) {
for (CodeableEnum e : values) {
if (e.getCode().equalsIgnoreCase(code)) {
return e;
}
}
return null;
}
}
Each CodeableEnum
class would still have to implement a getByCode
method, but the actual implementation of the method has at least been centralized to a single place.
public enum IMType implements CodeableEnum {
...
public IMType getByCode(String code) {
return (IMType)CodeableEnumHelper.getByCode(code, this.values());
}
}
这篇关于消除重复的枚举代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!