如何解决模仿可扩展枚举行为的综合正确方法是什么?
传统上,当我有一个枚举时:
public enum SomeEnum implements Serializable {
TYPE_1,TYPE_2;
}
或课程:
public class Country {
public static final Country SOME_COUNTRY = new Country("someCode");
private final String code;
...
}
在控制器中,我返回以下值以填充一些选择:
@RestController(...)
public List<Field> getFields() {
return Arrays.asList(SomeEnum.class.getEnumConstants());
// or
return Arrays.asList(Country.class.getDeclaredFields());
}
当前,我正在研究一个Webhook库,该库可以由某些最终产品导入。一些事件名称来自库本身,但其中一些不存在于库中(但存在于最终产品代码中):
Webhook
类如下:
public class Webhook {
private String url;
private List<WebhookEvent> events;
...
}
和WebhookEvent
如下:
public class WebhookEvent Serializable {
private long id;
private String name;
...
}
和WebhookEvent
从数据库中填充。我不希望在最终产品中创建一个控股类,例如:
public class EnabledEvent {
public static final WebhookEvent SOME_EVENT = new WebhookEvent("event.name");
...
}
因为这将从两个不同的角度控制应用程序的行为。但是,相反,我希望能够在数据库中有新条目时立即返回这些常量/字段。基本上,我希望能够模仿基于数据库中的条目扩展常量/枚举的行为。是否有正确的方法以编程方式实现这一目标?
解决方法
在我们的例子中,我们必须验证许多常量。这个常量文件开始堆积。因此,我们不得不设计一种不同的方法,最终只为常量创建了一个单独的表,因此您可以一次添加或删除/禁用不需要的表,而无需重新编译代码(尽管如果有依赖项,则必须这样做)情况)。
例如,假设您具有以下患者状态(STATUS):
稳定,严重,已减少,已恢复和不适用
以及TEST_RESULT的以下状态:
TEST_PENDING,TEST_NEGATIVE和TEST_POSITIVE
表格如下:
------------------------------------------------------------------------
enum_code enum_type enum_name enum_desc disabled
------------------------------------------------------------------------
001 STATUS STABLE false
002 STATUS CRITICAL false
003 STATUS DECEASED false
004 STATUS RECOVERED false
005 STATUS NA false
100 TEST_RESULT TEST_PENDING false
101 TEST_RESULT TEST_NEGATIVE false
102 TEST_RESULT TEST_POSITIVE false
------------------------------------------------------------------------
@Entity
@Table(name="constant_enum")
public class ConstantEnum implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="enum_code")
private Integer enumCode;
private boolean disabled;
@Column(name="enum_desc")
private String enumDesc;
@Column(name="enum_name")
private String enumName;
@Column(name="enum_type") // this is the discriminator
private String enumType;
//getters and setters
}
,
我最终删除了与数据库的连接,并在类本身内定义了静态变量,并使用静态ofValue
方法创建对象:
public class SomeClass implements Serializable {
public static final SomeClass MY_CONSTANT_1 = new SomeClass("static.value");
public static SomeClass [] values = new SomeClass []{
SomeClass .MY_CONSTANT_1,...
};
private String name;
public SomeClass (String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static SomeClass ofValue(String name){
if(StringUtils.isEmpty(name)) return null;
for(SomeClass value : values) if(value .getName().equalsIgnoreCase(name)) return event;
throw new IllegalArgumentException(String.format("Couldn't convert value : %s into a valid %s object",name,SomeClass.class.getName()));
}
}
这样,它可以扩展如下:
public class ExtendedSomeClass extends SomeClass implements Serializable {
public static final SomeClass MY_CONSTANT_2 = new SomeClass ("static.value.2");
public static SomeClass[] values = new SomeClass[]{
SomeClass.MY_CONSTANT_2,};
public static SomeClass ofValue(String name){
if(StringUtils.isEmpty(name)) return null;
for(SomeClass event : values) if(event.getName().equalsIgnoreCase(name)) return event;
return SomeClass.ofEvent(name);
}
}
我总是可以连接values
数组,并从@RestController
端点返回它以填充表单。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。