Java中枚举的通用接口
我在Hibernate/Spring上有一个web应用程序,我想在应用程序中使用的枚举数很少
public enum MerchantStatus {
NEW("New"),
...
private final String status;
MerchantStatus(String status) {
this.status = status;
}
public static MerchantStatus fromString(String status) {..}
public String toString() {..}
}
及
public enum EmployerType {
COOL("Cool"),
...
private final String type;
EmployerType (String type) {
this.type = type;
}
public static EmployerType fromString(String type) {..}
public String toString() {..}
}
我想创建一个转换器,将枚举对象转换为字符串,反之亦然。是这样的:
public class MerchantStatusConverter implements AttributeConverter<MerchantStatus, String> {
public String convertToDatabaseColumn(MerchantStatus value) {..}
public MerchantStatus convertToEntityAttribute(String value) {..}
}
问题是,我不想为每个枚举创建转换器,理想情况下,它应该是泛型类/接口,我将在这里使用多态性。问题是fromString
是静态方法,似乎不可能创建返回泛型类型的静态方法
这个问题有什么解决办法吗
# 1 楼答案
您别无选择,因为在注释实体时
AttributeConverter
实现无法参数化实际上,您应该只使用
AttributeConverter
类来指定它:但是,您可以定义一个抽象类来定义逻辑,并在每个枚举类中将其子类化
为了实现它,您应该在每个enum类前面引入一个接口,该接口声明一个
fromString()
和一个toString()
方法界面:
实现接口的枚举:
抽象
AttributeConverter
类:以及具体的
AttributeConverter
类,该类需要声明一个公共构造函数,以将受保护的myEnum
字段分配给枚举值(不管是什么):# 2 楼答案
如果您想要为所有
enum
类提供一个通用转换器,那么可以使用反射,只要您坚持命名约定你的习惯似乎是用}的
toString()
表示enum
->String
转换,以及static
{String
->enum
转换一个这样的转换器:
然后通过命名类来构造它,例如
# 3 楼答案
你应该能够做到以下几点: