消除重复的枚举代码 [英] eliminating duplicate Enum code

查看:131
本文介绍了消除重复的枚举代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有大量枚举实现这个界面:

  / ** 
*枚举,每个元素可以通过代码唯一标识
* /
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);
}

但事实证明是相当无用的,因为:


  1. 枚举不能扩展类

  2. 枚举元素(SKYPE,GOOGLE_TALK等)不能扩展类

  3. 我不能提供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:

  1. An enum cannot extend a class
  2. Elements of an enum (SKYPE, GOOGLE_TALK, etc.) cannot extend a class
  3. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆