我有;
public enum Detailed {
PASSED, INPROCESS, ERROR1, ERROR2, ERROR3;
}
Run Code Online (Sandbox Code Playgroud)
并需要将其转换为以下内容;
public enum Simple {
DONE, RUNNING, ERROR;
}
Run Code Online (Sandbox Code Playgroud)
所以首先PASSED- > DONE和INPROCESS- > RUNNING,但所有错误应该是:ERROR.显然,可以为所有值编写案例,但可能有更好的解决方案?
Jon*_*eet 27
就个人而言,我只是创建一个Map<Detailed, Simple>并明确地做 - 甚至可能使用一个switch语句.
另一种方法是将映射传递给构造函数 - 当然,你只能单向循环:
public enum Detailed {
PASSED(Simple.DONE),
INPROCESS(Simple.RUNNING),
ERROR1(Simple.ERROR),
ERROR2(Simple.ERROR),
ERROR3(Simple.ERROR);
private final Simple simple;
private Detailed(Simple simple) {
this.simple = simple;
}
public Simple toSimple() {
return simple;
}
}
Run Code Online (Sandbox Code Playgroud)
(我觉得这比Ted使用多态的方法更简单,因为我们并没有真正尝试提供不同的行为 - 只是一个不同的简单映射.)
虽然你可能会使用序数值做一些狡猾的事情,但它会更不明显,并且需要更多的代码 - 我认为没有任何好处.
Ted*_*opp 25
一种方法是asSimple()在Detailed枚举中定义一个方法:
public enum Detailed {
PASSED {
@Override
Simple asSimple() {
return DONE;
}
},
INPROCESS {
@Override
Simple asSimple() {
return RUNNING;
}
},
ERROR1,
ERROR2,
ERROR3;
public Simple asSimple() {
return Simple.ERROR; // default mapping
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在想要进行映射时简单地调用该方法:
Detailed code = . . .
Simple simpleCode = code.asSimple();
Run Code Online (Sandbox Code Playgroud)
它具有将映射的知识与Detailed枚举(可能属于它)放在一起的优点.它的缺点是具有Simple与代码混合的知识Detailed.根据您的系统架构,这可能是也可能不是坏事.
使用EnumMap
我通过实现转换服务将外部xml接口与内部域模型分离.这包括将jaxb生成的代码中的枚举映射到域模型枚举.
使用静态EnumMap封装了负责转换的类中转换的关注点.它的凝聚力.
@Service
public class XmlTransformer {
private static final Map<demo.xml.Sense, Constraint.Sense> xmlSenseToSense;
static {
xmlSenseToSense = new EnumMap<demo.xml.Sense, Constraint.Sense> (
demo.xml.Sense.class);
xmlSenseToSense.put(demo.xml.planningInterval.Sense.EQUALS,
Constraint.Sense.EQUALS);
xmlSenseToSense.put(demo.xml.planningInterval.Sense.GREATER_THAN_OR_EQUALS,
Constraint.Sense.GREATER_THAN_OR_EQUALS);
xmlSenseToSense.put(demo.xml.planningInterval.Sense.LESS_THAN_OR_EQUALS,
Constraint.Sense.LESS_THAN_OR_EQUALS);
}
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29225 次 |
| 最近记录: |