如何在java中将一个枚举转换为另一个枚举?

use*_*818 25 java enums

我有;

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- > DONEINPROCESS- > 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.根据您的系统架构,这可能是也可能不是坏事.

  • 我认为将枚举中的映射逻辑放到另一个枚举中会破坏封装,引入耦合并降低内聚性.枚举的关注应该只是表示一组状态(或概念).从一个枚举映射到另一个枚举的关注应该单独封装. (3认同)
  • @Chomeh - 我在答案中注意到"详细"最终需要"简单"的知识.(基本上,我在你的评论中表达了同样的担忧,但是对于称之为"劣势"的相当模糊的批评.你更精确.)尽管如此,我认为这种方法值得考虑.OP的枚举名称表明`Detailed`在概念上是对`Simple`的改进.如果是这种情况,那么`Detailed`与`Simple`的耦合并不是一件坏事(就像子类与其父类耦合并不总是坏的一样). (3认同)

Cho*_*meh 9

使用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)