使用SimpleFramework动态转换为枚举

时间:2012-07-27 11:29:31

标签: java enums simple-framework

我有一个XML字符串,其属性包含整数值:

<item status="2" />

还有Simple Framework类来描述此item

@Root
public static class Item {

    @Attribute(name="status")
    private int status;

    public int getStatus() {
        return status;
    }

}

反序列化效果很好,但我希望能够将int类型更改为定义的enum类型。

public enum Status {
    OK(0), PENDING(1), ERROR(2);

    BetStatus(int status) {
        this.status = status;
    }

    public int getStatus() {
        return status;
    }
}

快速修改:

@Root
public static class Item {

    @Attribute(name="status")
    private Status status;

    public Status getStatus() {
        return status;
    }

}

然而现在我收到一个错误:

java.lang.IllegalArgumentException: 2 is not a constant in com.my.package.Status

在反序列化期间是否可以以这种方式投射int

我打赌我必须在我的Status课程中添加一些魔术方法。

解决方案:

根据Reimeus回答,我为int属性留下了status类型,我修改了Item类:

@Root
public static class Item {

    @Attribute(name="status")
    private int status;

    public Status getStatus() {
        return Status.getByOrdinal(status);
    }

}

1 个答案:

答案 0 :(得分:2)

也许通过迭代类型:

public enum Status {
    OK(0), PENDING(1), ERROR(2);

    private int status;

    Status(int status) {
        this.status = status;
    }

    public static Status getByOrdinal(int ordinal) {
        for (final Status element : EnumSet.allOf(Status.class)) {
            if (element.ordinal() == ordinal) {
                return element;
            }
        }

        throw new IllegalArgumentException("Unknown status type: " + ordinal);
    }
}