1

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

初始枚举类

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

1 回答 1

0

方式一

您可以使用静态常量声明一个实体(如果您使用 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;
    }
}

方式二

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

于 2013-09-18T19:52:39.103 回答