首页 > 解决方案 > JAVA为枚举设计一个工厂

问题描述

根据参数动态确定一组类似结构的枚举。

例子 :

public enum StateUS {
 CALIFORNIA(Sacramento,...)
 private String capital;
 ...
}

public enum StateIN {
 KARNATAKA(Bangalore,...)
 private String capital;
 ...
}

public enum Countries {
US, IN
}

// in a different class
public <> getStates(Countries country){
// to return Country.US.equals(country) ?  StateUS : StateIN 
// so the return enum class can be used for business logic.
}

根据 enum 的值Countries,需要决定是否使用StateUSor StateIN

使用枚举实现相同功能的最佳方法是什么?可以实现工厂类来决定 enum 吗?

我能想到的解决方案是将枚举转换为类并创建一个工厂类。但这是一个乏味的过程,并且需要太多的锅炉代码来获得枚举功能(例如:比较)。

标签: javaenumsfactory

解决方案


我就是这样做的。您需要添加一个State接口:

public interface State {
    String getCapital();
}

然后制作两者StateINStateUS实现这样的接口:

public enum StateIN implements State {
    KARNATAKA("Bangalore");

    private String capital;

    StateIN(String capital) {
        this.capital = capital;
    }

    @Override
    public String getCapital() {
        return capital;
    }
}
public enum StateUS implements State {
    CALIFORNIA("Sacramento");

    private String capital;

    StateUS(String capital) {
        this.capital = capital;
    }

    @Override
    public String getCapital() {
        return capital;
    }
}

在您的Countries枚举中,您需要利用State接口来允许以下操作:

public enum Countries {
    IN(Arrays.asList(StateIN.values())),
    US(Arrays.asList(StateUS.values()));

    private List<? extends State> states;

    Countries(List<? extends State> states) {
        this.states = states;
    }

    public List<? extends State> getStates() {
        return states;
    }
}

现在你可以实现你getStates(Countries country)想要的:

public static List<? extends State> getStates(Countries country){
    return country.getStates();
}

下面是一个示例,您可以检查它是否确实有效:

public static void main(String[] args) {
    System.out.println("States");
    System.out.println("IN: " + getStates(Countries.IN));
    System.out.println("US: " + getStates(Countries.US));
    System.out.println("");
    System.out.println("States Capital");
    System.out.println("IN: " + getStates(Countries.IN).stream().map(State::getCapital).collect(Collectors.toList()));
    System.out.println("US: " + getStates(Countries.US).stream().map(State::getCapital).collect(Collectors.toList()));
}

推荐阅读