- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 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) {..}
}
问题是我不想为每个枚举创建转换器,理想情况下它应该是通用类/接口(interface),我将在这里使用多态性。问题是 fromString
是静态方法,似乎不可能创建返回泛型类型的静态方法。
这个问题有什么解决方案吗?
最佳答案
The problem is that I don't want to create converter for each enum and ideally it should be generic class/interface and I will use polymorphism here.
您别无选择,因为在您注释实体时无法参数化您的 AttributeConverter
实现。
你确实应该只用 AttributeConverter
类指定它:
@Enumerated(EnumType.STRING)
@Convert(converter = MerchantStatusConverter.class)
private MerchantStatus merchantStatus;
但是您可以定义一个抽象类来定义逻辑并在每个枚举类中对其进行子类化。
要实现它,您应该在每个声明 fromString()
和 toString()
方法的枚举类前面引入一个接口(interface)。
界面:
public interface MyEnum<T extends MyEnum<T>>{
T fromString(String type);
String toString(T enumValue);
}
实现接口(interface)的枚举:
public enum MerchantStatus implements MyEnum<MerchantStatus> {
NEW("New"), ...
@Override
public MerchantStatus fromString(String type) {
...
}
@Override
public String toString(MerchantStatus enumValue) {
...
}
}
抽象AttributeConverter
类:
public abstract class AbstractAttributeConverter<E extends MyEnum<E>> implements AttributeConverter<E, String> {
protected MyEnum<E> myEnum;
@Override
public String convertToDatabaseColumn(E attribute) {
return myEnum.toString(attribute);
}
@Override
public E convertToEntityAttribute(String dbData) {
return myEnum.fromString(dbData);
}
}
具体的 AttributeConverter
类需要声明一个公共(public)构造函数以将 protected myEnum
字段分配给枚举值(无论是哪个):
public class MerchantStatusAttributeConverter extends AbstractAttributeConverter<MerchantStatus> {
public MerchantStatusAttributeConverter(){
myEnum = MerchantStatus.NEW;
}
}
关于java - Java 枚举的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45129921/
我是一名优秀的程序员,十分优秀!