当前位置: 首页 > 知识库问答 >
问题:

如何删除类似基于Java字符串的枚举中的公共代码

万俟英锐
2023-03-14

我有一个类,其中可能有几个枚举
每个枚举都应该有一个与每个条目关联的字符串值。为了实现这一点,我添加了一个参数化构造函数,一个支持字符串类的成员,并重写了toString方法。

然而,可以看到我的两个枚举之间的50%的代码是相同的。它只是支持将字符串映射到Enum值的代码。

如何将此代码移动到公共位置并避免代码重复?

编辑:当我写《美国》时,用例是很容易获得“纽约”。国家。纽约。

以下是我尝试的,
1)我尝试使用公共接口,但构造函数不同
2)我尝试使用继承,但无法继承枚举

public class America {
    public enum STATES {
        NY("New York"), CA("California");
        String displayName;

        STATES(String displayName) {
            this.displayName = displayName;
        }

        @Override
        public String toString() {
            return this.displayName;
        }
    }

    public enum PROVINCES {
        ON("Ontario"), QU("Qubec");

        String displayName;

        PROVINCES(String displayName) {
            this.displayName = displayName;
        }

        @Override
        public String toString() {
            return this.displayName;
        }

    }
}

共有2个答案

孙泉
2023-03-14

您可以实现一个ENumUtils类,并将其静态实例添加到每个枚举类。我在这里实现了一个例子:https://stackoverflow.com/a/48199147/7949301.

汪德明
2023-03-14

我喜欢使用的一个典型短语是“数据不是行为的一部分,也不属于代码”。明确地说(从我的经验来看),采用或翻译一个依赖于数据的系统要容易得多,因为它是从某个东西加载的,而不是用硬编码的值来表示数据。

public class Region {
    private final String name;
    public Region(String name) { this.name = name; }
    public String getDisplayName() { return this.name; }
    public String toString() { return getDisplayName(); }
}

public class Country {
    //keeps a map/list of "regions", whether states or provinces or some other type
    public Region getRegion(Object key); //lookup a region based on some key, I'll use strings here
}

Country america = /* a country supplied from somewhere */;
String name = america.getRegion("NY").getDisplayName(); //"New York"

这种方法虽然对代码中的硬编码引用(如getRegion(“NY”))不太理想,但在以后需要修改数据或创建从其他地方加载的引用(例如,用户提供的Region或查找名称)时,会更加宽容。如果使用数据库,则可以使代码保持最新,而无需更改项目,只需更改数据库本身。最后,由于所有这些与数据相关的信息都存储在其他地方,因此要处理的代码总量大大减少。

您还可以稍后添加一些内容来支持确定给定的行政区是州或省还是其他什么(我认为枚举非常适合):

public enum RegionType {
    STATE, PROVINCE, ADMIN_REGION, OTHER,
    ;
}
 类似资料:
  • 例如,我如何做类似的事情: 结果示例:

  • 我是MVC编程的新手。所以我用的是play框架。 获取未捕获的引用Error:未定义MODERATED

  • 因此,进一步寻找,我发现这个人有一个解决方案:typescript中基于字符串的枚举的解决方案 这将允许像这样的东西工作: 唯一的回应基本上是说这样做是不安全的。(但我应该说,它确实起作用了--我可以键入eventtype.dot...Atom editor给了我5个大小写选项可供选择(保持代码中的内容一致),然后我可以使用它将字符串值吐出来,给我的用户一个很好的填充空间的体验,将来我可以更改枚举

  • 问题内容: 首先,这不是中Enums的重复:) 这个问题的公认答案表明,这是表示Ruby中枚举的好方法: 在Java中,可以将多个值和方法附加到枚举值。我想在Ruby中实现相同或相似的东西。 代表此Java枚举的最类似于Ruby的方式是什么: 编辑: 我还想保留Java枚举的隐式功能: …检索序数值 …对枚举值(或等效值)的调用方法 例子: 问题答案: class MyEnum attr_acce

  • 问题内容: 说我有一个枚举 并且我想找到一个字符串的枚举值,例如它将是。这怎么可能呢? 是我需要的方法吗?如果是这样,我将如何使用它? 问题答案: 是的,会给你的。 请注意,该名称必须是精确匹配,包括大小写:与两抛出。 静态方法和是在编译时创建的,不会出现在源代码中。但是,它们确实出现在中。例如,显示两种方法。

  • 问题内容: 我觉得这是一个简单的问题,但是我尝试过的所有事情都不适合我。我有一个枚举,我有字符串构造函数的原因是因为Java不允许枚举为数字..我在没有字符串构造函数的情况下直接尝试了AA,AB,2C,但这给出了错误。请注意,对于现有的枚举,我要添加C(“ 2C”)。 现在我有一个mybatis映射器,它会进行合并,这是现有的,并且映射器的参数之一是TestEnum。到目前为止,由于枚举值和字符串