【问题标题】:JAVA design a factory for enum'sJAVA为枚举设计一个工厂
【发布时间】:2021-11-15 05:59:43
【问题描述】:

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

示例:

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.
}

根据枚举Countries的值,需要决定是使用StateUS还是StateIN。

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

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

【问题讨论】:

  • 您的用例是什么?请注意,枚举是类。在您的情况下,当您想要返回 StateUS 或 StateIN 时,它实际上意味着您想要返回 Class&lt;? extends Enum&gt;,因为无法以任何其他方式考虑这两个。这真的是你想要的吗?
  • 您真正想要返回什么?状态列表或类型(即 StateUS 或 StateIN)?
  • @MirekPluta 是的,我想返回类,我们可以从类中获取枚举的实例吗?这样我们就可以将引用用作常规枚举持有者。例如:getStates(US).valueOf("california") 或 getStates(US).doSomething()(在 Enum 中定义)
  • @ernest_k 枚举类型

标签: java enums factory


【解决方案1】:

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

public interface State {
    String getCapital();
}

然后让StateIN 和StateUS 都实现这样的接口:

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()));
}

【讨论】:

  • 我正在尝试将枚举类型处理程序作为 getStates() 函数的响应。 public enum Countries { IN(StateIN), US(StateUS); private Class&lt;? extends Enum&lt;?&gt;&gt; states; Countries(Class&lt;? extends Enum&lt;?&gt;&gt; states) { this.states = states; } public Class&lt;? extends Enum&lt;?&gt;&gt; getStates() { return states; } } 和 Class&lt;? extends Enum&lt;?&gt;&gt; getStates(Country country) 这将有助于访问在 States&lt;&gt; 枚举中定义的任何静态方法。但是是否有可能从 Class 对象获取 Enum 类型引用?更好的方法?
  • 我没有更好的方法。我的建议和我认为的一样好。
猜你喜欢
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多