【问题标题】:Replacing Enum constants with static variable fetched from table用从表中获取的静态变量替换枚举常量
【发布时间】:2013-09-18 19:25:31
【问题描述】:

处理包含一组常量的旧枚举类。枚举类中定义了一个函数来检查枚举中是否存在传递的常量。 现在可以将一些常量添加到枚举中。如果是这样,它必须经过单独的发布过程。 所以我们想摆脱枚举并从数据库或属性文件中获取数据,这样任何新添加都不需要通过发布。 但它有一个问题。引用枚举的模块太多,因此取消枚举会导致文件更改过多。

初始枚举类

     Class enum Planets{EARTH,MARS,SATURN};

       private static final Planets[] codes={EARTH,MARS,SATURN};

       public static boolean isPlanetPresent(String str){//static Edited 19-09-2013
       for(Palnets planet : codes){
        if(planet.equals(str)){
        return true;
        }
          return false;
      }

如果我们需要检查 NEPTUNE 是否是行星的一部分,那么我们需要使用 Planets.isPlanetPresent("NEPTUNE")

为了尽量减少改动,我决定保留枚举类但作为普通类。 静态数组在类中声明,并在运行时加载,从 db 中的表中读取数据。

我想到的静态替代方案:

 Class Planets{

private static String[] codes;

public Planets{
    Spring IOC to connect to db and get the data and place it into codes array( EARTH,MARS,SATURN)
}

public static boolean isPlanetPresent(String str){
    for(String planet : codes){
        if(planet.equals(str)){
        return true;
        }
          return false;
    }
}

有了上面的实现,Planets.isPlanetPresent("NEPTUNE") 不需要在其他文件中更改。

我的问题是:

  1. 我的实现是否正确?
  2. 有没有更好的替代实现?

【问题讨论】:

  • 初始枚举很奇怪
  • 您的代码对我来说看起来不错。如果要在运行时添加常量,则应使用 Set 而不是字符串数组。如果您认为多个线程可以修改 Set,请使用并发 Set。
  • 同意它的旧代码..
  • 您可以使用 Set 和 contains() 方法来查看行星是否存在。
  • 点将优化它..

标签: java spring enums


【解决方案1】:

方式 1

你可以用静态常量声明一个实体(如果你使用 ORM),像这样(使用休眠):

public class Planet {

    public static final Planet SATURN = new Planet(1L, "SATURN");

    public static final Planet MARS = new Planet(2L, "MARS");

    // ...

    private static final Planet[] VALUES = { SATURN, MARS /*, ...*/ }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    private Planet(final Long id, final String name) {
        this.id = id;
        this.name = name;
    }

    /**
     * Simulates enum#values().
     * 
     * @return list of declared values.
     */
    public static Planet[] values() {
        return VALUES.clone();
    }

    /**
     * Simulates enum#valueOf(String).
     * 
     * @return found {@link Planet} or null.
     */
    @Nullable
    public static Planet valueOf(final String name)
    {
        Planet result = null;
        for (final Planet val : values()) {
            if (val.getName().equals(name)) {
                result = val;
                break;
            }
        }
        return result;
    }
}

方式 2

坚持使用枚举,并使用数据库“枚举”数据类型来确保添加枚举值时数据库更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多