java - 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
,需要决定是否使用StateUS
or StateIN
。
使用枚举实现相同功能的最佳方法是什么?可以实现工厂类来决定 enum 吗?
我能想到的解决方案是将枚举转换为类并创建一个工厂类。但这是一个乏味的过程,并且需要太多的锅炉代码来获得枚举功能(例如:比较)。
解决方案
我就是这样做的。您需要添加一个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()));
}
推荐阅读
- django - Django 测试并行问题
- c# - 如何在 c# 中将 grant_type 设置为 key 并将 value 设置为 client_credentials (rest service)
- c# - 防止EF核心在尝试删除但有限制约束时抛出异常异常
- javascript - 如何将时间从UTC更改为moment.js中选择的时区?
- c++ - 如何将字符串的一部分转换为整数?
- angular - 在 Angular 6 Typescript 中更改事件的 FullCalendar 单元格背景颜色
- blockchain - 仅使用 EVM API 在区块链上部署智能合约,而不使用 geth 或 tuffle 或 ganache?
- c# - Entity Framework Core 遍历大 blob 数据没有内存溢出,最佳实践
- python-3.x - 模拟补丁变量的方法
- caching - 如果页面已发布或过期,如何清除缓存