如何消除重复的Enum代码? [英] How can I eliminate duplicated Enum code?

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

问题描述

我有很多实现此接口的枚举:

I have a large number of Enums that implement this interface:

/**
 * Interface for an enumeration, each element of which can be uniquely identified by its 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();
}

一个典型的例子是:

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您可以想象这些方法在CodableEnum的所有实现中实际上是相同的。我想消除这种重复,但坦率地说不知道如何做。我尝试使用如下所示的类:

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. 枚举不能扩展类

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

  3. 我无法提供getByCode()的默认实现,因为DefaultCodableEnum本身不是枚举。我尝试更改DefaultCodableEnum以扩展java.lang.Enum,但似乎不允许这样做。

任何不建议的建议依靠反思?
谢谢,
Don

Any suggestions that do not rely on reflection? Thanks, Don

推荐答案

您可以将重复的代码分解为 CodeableEnumHelper 类:

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;
    }
}

每个 CodeableEnum 类仍然必须实现 getByCode 方法,但是该方法的实际实现至少已集中到一个地方。

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());
    } 
}

这篇关于如何消除重复的Enum代码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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