Java 中枚举的通用接口

Bor*_*kel 5 java generics enums

我在 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() {..}
}
Run Code Online (Sandbox Code Playgroud)

public enum EmployerType {
    COOL("Cool"),
    ...

    private final String type;

    EmployerType (String type) {
        this.type = type;
    }

    public static EmployerType fromString(String type) {..}    

    public String toString() {..}
}
Run Code Online (Sandbox Code Playgroud)

我想创建转换器以将我的枚举对象转换为字符串,反之亦然。它是这样的:

public class MerchantStatusConverter implements AttributeConverter<MerchantStatus, String> {
    public String convertToDatabaseColumn(MerchantStatus value) {..}

    public MerchantStatus convertToEntityAttribute(String value) {..}
}
Run Code Online (Sandbox Code Playgroud)

问题是我不想为每个枚举创建转换器,理想情况下它应该是通用类/接口,我将在这里使用多态。问题是这fromString是静态方法,似乎不可能创建返回泛型类型的静态方法。

这个问题有解决方案吗?

dav*_*xxx 5

问题是我不想为每个枚举创建转换器,理想情况下它应该是通用类/接口,我将在这里使用多态性。

您别无选择,因为AttributeConverter在注释实体时无法对您的实现进行参数化。

您确实应该仅在AttributeConverter类中指定它:

@Enumerated(EnumType.STRING)
@Convert(converter = MerchantStatusConverter.class)
private MerchantStatus merchantStatus;
Run Code Online (Sandbox Code Playgroud)

但是您可以定义一个抽象类来定义逻辑并在每个枚举类中对其进行子类化。为了实现它,你应该在每个声明一个和一个方法
的枚举类前面引入一个接口。fromString()toString()

界面:

public interface MyEnum<T extends MyEnum<T>>{

     T fromString(String type);
     String toString(T enumValue);
}
Run Code Online (Sandbox Code Playgroud)

实现接口的枚举:

public enum MerchantStatus implements MyEnum<MerchantStatus> {

    NEW("New"), ...


    @Override
    public MerchantStatus fromString(String type) {
     ...
    }

    @Override
    public String toString(MerchantStatus enumValue) {
     ...
    }
}
Run Code Online (Sandbox Code Playgroud)

抽象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);
    }
}
Run Code Online (Sandbox Code Playgroud)

AttributeConverter需要声明一个公共构造函数以将受保护myEnum字段分配给枚举值(无论它是什么)的具体类:

public class MerchantStatusAttributeConverter extends AbstractAttributeConverter<MerchantStatus> {
   public MerchantStatusAttributeConverter(){
      myEnum = MerchantStatus.NEW; 
   }
}
Run Code Online (Sandbox Code Playgroud)