1

整数値を含む属性を持つ 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タイプを残し、クラスだけを次のように変更しました。statusItem

@Root
public static class Item {

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

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

}
4

2 に答える 2

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);
    }
}
于 2012-07-27T11:40:40.130 に答える
1

getByOrdinalReimeus が提供するメソッドItemを、int を取る追加のセッターと組み合わせます。

public void setStatus(int status)
{
    this.status = Status.getByOrdinal(status);
}
于 2012-07-27T11:54:01.343 に答える