不在枚举时返回对象

时间:2017-08-24 08:11:45

标签: java parsing java-ee enums

用例

如果错误代码未包含在枚举中,则返回新的Ausloesungsart,其解析的错误代码为UNDEFINED

方案

我有一些预定义的枚举。

 UNDEFINED(-1),
 FIS(0),
 MANUELL(1)

如果错误代码-1,0,1不在收到的消息中,我希望在前端有此消息 <NUMBER> = Unknown。枚举的类型为Ausloesungsart,将由

设置
public Ausloesung(Ausloesungsart ausloesungsart) {
    setAusloesungsart(ausloesungsart);
}

,这由消息解析器调用

        Ausloesung ausloesung = new Ausloesung(Ausloesungsart.fromIdentifier(header.getReleaseType()));

映射在这里:

public static Ausloesungsart fromIdentifier(Integer code) {

        if (enumsByIdentifier.containsKey(code)) {
            return enumsByIdentifier.get(code);
        } else {
            return Ausloesungsart.UNDEFINED;
        }
    }

Ausloesung

@Type(type = "GenericEnumUserType", parameters = {
@Parameter(name = "enumClass", value = "Ausloesungsart"),
@Parameter(name = "identifierMethod", value = "toIdentifier"),
@Parameter(name = "valueOfMethod", value = "fromIdentifier") })
private Ausloesungsart ausloesungsart;

由于枚举是最终的,无法更改,我不知道如何解决这个问题。我需要在解析中返回Ausloesung,目前需要Ausloesungsart

属性

# Ausloesungsart
UNDEFINED= {0} \= Unbekannt
FIS=0 \= FIS
MANUELL=1 \= Manuell

XHTML

<h:outputFormat id="tests1" value="#{res.meldungsList_ausloesungsArt}" 
                          rendered="#{meldungList.meldung.ausloesung.ausloesungsart.identifier == -1}"
                                        style="white-space: nowrap">
                                        <f:param value="#{meldungList.meldung.ausloesung.ausloesungsart}" />
                                        <f:param value="#{meldungList.meldung.ausloesung.ausloesungsart.identifier}" />

                                    </h:outputFormat>

                                    <h:outputFormat id="tests2" value="#{meldungList.meldung.ausloesung.ausloesungsart}" 
                          rendered="#{meldungList.meldung.ausloesung.ausloesungsart.identifier != -1}"
                                        style="white-space: nowrap">
                                    </h:outputFormat>

问题

fromIdentifier方法导致问题。它必须(建筑)返回Ausloesungsart,但另一方面,如果它没有包含在列表中,我必须动态创建一个Ausloesungsart(这是枚举)!

更新

使用包装类修复它。 class AusloesungsArtWithValues

1 个答案:

答案 0 :(得分:0)

您的枚举的实现是否适合您。

public class Test3 {
    static enum Ausloesungsart{
        UNDEFINED(-1),
        FIS(0),
        MANUELL(1);
        Ausloesungsart(Integer i){

        }
        public static Ausloesungsart fromIdentifier(Integer i) {
            switch(i) {
                case 0: return FIS;
                case 1: return MANUELL;
                case -1:return UNDEFINED;
            }
            return UNDEFINED;
        }
    }

    public static void main(String args[]) {
        Integer input = 0;
        Ausloesungsart enumval = Ausloesungsart.fromIdentifier(input);
        System.out.println(enumval);
    }   
}

枚举本身处理任何无效的值并返回UNDEFINED版本。