用从表中获取的静态变量替换枚举常量

时间:2013-09-18 19:25:32

标签: java spring enums

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

初始枚举类

     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. 有没有更好的替代实施?

1 个答案:

答案 0 :(得分:0)

方式1

您可以使用静态常量声明一个实体(如果使用ORM),类似这样(使用hibernate):

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

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