Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用从表中获取的静态变量替换枚举常量_Java_Spring_Enums - Fatal编程技术网

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

Java 用从表中获取的静态变量替换枚举常量,java,spring,enums,Java,Spring,Enums,处理包含一组常量的旧枚举类。枚举类中定义了一个函数,用于检查枚举中是否存在传递的常量。 现在可以将一些常量添加到枚举中。如果是这样,它必须经过单独的发布过程。 所以,我们希望去掉enum,从数据库或属性文件中获取数据,这样任何新的添加都不需要经过发布。 但它有一个问题。引用枚举的模块太多,因此取消枚举将导致太多文件更改 初始枚举类 Class enum Planets{EARTH,MARS,SATURN}; private static final Planets[]

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

初始枚举类

     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;
      }
如果我们需要检查海王星是否是行星的一部分,那么我们需要使用planetpresentneptune.isPlanetPresentNEPTUNE

为了尽量减少更改,我决定保留enum类,但将其作为普通类。 静态数组在类内声明,并在从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;
    }
}
通过上述实现,PlanetPresentNeptune不需要在其他文件中更改

我的问题是:

我的实现正确吗? 有更好的替代实现吗? 方式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 enumerated datatype确保在添加枚举值时更改DB。

初始枚举很奇怪您的代码对我来说很好。如果要在运行时添加常量,则应使用集合而不是字符串数组。如果您认为多个线程可以修改该集合,请使用并发集合。这是一个旧代码。您可以使用集合和contains方法来查看行星是否存在。所采取的要点将对其进行优化。。