当前位置: 首页 > 面试题库 >

如何消除重复的Enum代码?

郑博
2023-03-14
问题内容

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

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

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

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

但这实际上是没有用的,因为:

  1. 枚举不能扩展类
  2. 枚举的元素(SKYPE,GOOGLE_TALK等)无法扩展类
  3. 我无法提供getByCode()的默认实现,因为DefaultCodableEnum本身不是枚举。我尝试更改DefaultCodableEnum以扩展java.lang.Enum,但这似乎是不允许的。

有没有不依靠反思的建议?谢谢唐


问题答案:

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

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方法,但是该方法的实际实现至少已集中到一个地方。

public enum IMType implements CodeableEnum {
    ...
    public IMType getByCode(String code) {
        return (IMType)CodeableEnumHelper.getByCode(code, this.values());
    } 
}


 类似资料:
  • 问题内容: 我正在尝试为Java创建一个小的功能性编程库(只是为了解决自己的问题)。虽然定义高阶函数为S,S和就是我所遇到的这个问题:需要收集的功能,并返回相同类型的具有几乎相同的实现的集合,但必须重新界定为每个数据结构-s,s和s。 例如,这是s和s 的函数的实现: 一个函数: 如从这个例子可以看出,对于实施方式中的主体和几乎相同。 有喜欢很多很多的功能,并在我的图书馆,每一类又是对每种类型我很

  • 我构建了一个使用BingAPI下载数据集的代码。当我在终端上运行它时,它返回以下错误: 所以我升级了Numpy,但没有用 那么我该怎么做呢?

  • 问题内容: 我有一个这样的表: 17年7月1日100年 7月2日100年 3月7日100年17年7月300 17年7月4日300年 7月5日500年 7月5日500年7月7日听500年 7月7日听300年 8月7日听700年17年7月 9日听100 17年7月10日听100 我想输出是(按顺序)通过消除重复的连续但不是全部重复: 100 300 500 300 400 100 我无法选择Disti

  • 问题内容: 我必须向现有表添加唯一约束。很好,除了表已经有数百万行,而且许多行违反了我需要添加的唯一约束。 删除有问题的行的最快方法是什么?我有一条SQL语句,该语句查找重复项并将其删除,但要花很长时间才能运行。有没有其他方法可以解决此问题?也许备份表,然后在添加约束后还原表? 问题答案: 其中一些方法似乎有些复杂,我通常这样做是: 给定table table,要在()上对其进行唯一化,使行保持为

  • 我定义了一个类作为规则引擎的事件 它有以下成员1.电话号码2.纬度3.经度 我如何制定一个规则,其中1。该规则计算同一地点不同人数的数量2。同一人如果在1分钟的间隔内多次穿越同一地点,应仅计算为一个,不应重复 我制定了以下规则,但似乎不起作用 有人能帮忙吗? 问候Subbu

  • 问题内容: 添加它是否包含此值之前,如何检查我的json … 问题答案: 明显的方式 最明显的方法是使用循环并遍历数组中的所有项目,并在每次想知道是否已经有特定项目时进行比较。琐碎但乏味,尤其是当您要进行很多比较时。 每当您要搜索现有对象时: 聪明的方式 此代码使用Javascript的功能,其原型可在某种关联的内存存储中用作数组。假设您的JSON项目位于变量中。定义您的比较键(例如,名字和姓氏)