处理包含常量组的旧枚举类。枚举类中的函数被定义为检查枚举中是否存在传递的常量。 现在可能会有一些常量可以添加到枚举中。如果是这样,它必须经过单独的发布过程。 因此,我们希望摆脱枚举并从数据库或属性文件中获取数据,以便任何新添加都不需要通过发布。 但它存在问题。有太多的模块引用枚举,因此降级枚举会导致文件更改太多。
初始枚举类
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")
无需在其他文件中更改。
我的问题是:
答案 0 :(得分:0)
您可以使用静态常量声明一个实体(如果使用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;
}
}
坚持使用枚举,并使用DB“枚举”数据类型来确保在添加枚举值时更改数据库。