3

Java <5.0 で列挙型のクラスをシミュレートするにはどうすればよいですか ..??

public final class Week {

    private static final Day[] _week = {Day.MONDAY, Day.TUESDAY, Day.WEDNESDAY, Day.THURSDAY, Day.FRIDAY, Day.SATURDAY, Day.SUNDAY};

    public static Day getDayOfWeek(final int index) {
        if (index >= 1 && index <= 7) {
            return _week[index - 1];
        }
        throw new IndexOutOfBoundsException("Invalid index [1..7]");
    }

    public static final class Day {
        public static final Day MONDAY = new Day(1, "Monday");
        public static final Day TUESDAY = new Day(2, "Tuesday");
        public static final Day WEDNESDAY = new Day(3, "Wednesday");
        public static final Day THURSDAY = new Day(4, "Thursday");
        public static final Day FRIDAY = new Day(5, "Friday");
        public static final Day SATURDAY = new Day(6, "Saturday");
        public static final Day SUNDAY = new Day(7, "Sunday");

        private int _value;
        private String _name;

        private Day(final int value, final String name) {
            _value = value;
            _name = name;
        }

        /* (non-Javadoc)
         * @see java.lang.Object#toString()
         */
        public String toString() {
            return "[Day] " + _name;
        }

        /* (non-Javadoc)
         * @see java.lang.String#equals(java.lang.Object)
         */
        public boolean equals(Object anObject) {
            Day d = (Day)anObject;
            return _value == d._value;
        }
    }

    public static void main(String[] agrs) {
         System.out.println(Week.getDayOfWeek(2));
    }
}
4

4 に答える 4

5

効果的なJavaで説明されているタイプセーフな列挙型を使用してください。これに関する Joshua Blochs の記事からの例を次に示します。

// The typesafe enum pattern
public class Suit {
    private final String name;

    private Suit(String name) { this.name = name; }

    public String toString()  { return name; }

    public static final Suit CLUBS =
        new Suit("clubs");
    public static final Suit DIAMONDS =
        new Suit("diamonds");
    public static final Suit HEARTS =
        new Suit("hearts");
    public static final Suit SPADES =
        new Suit("spades");
}

タイプセーフな列挙型をSerializableにしたい場合は、readResolveメソッドを介して再構築を制御することを忘れないでください。

于 2010-08-19T09:43:46.450 に答える
4

Joshua Bloch はずっと前に、それを説明する記事を書きました。

于 2010-08-19T09:42:46.567 に答える
0

Joshua Bloch は、彼の「Effective Java」の初版でその方法を示しています。仕事に行かなければならないので、今は詳細を入力できません。さらに続きます。

于 2010-08-19T09:41:40.733 に答える
0

Krock と Riduidel が提案している解決策は非常に優れていますが、変換可能な値と定数 switch-caseにのみ適用されるため、声明は不可能です。組み合わせは優れた機能であり、一連の s よりも読みやすいです(ちなみに:とにかく、一連の s としてコンパイルされますよね?)。それで、議論されたパターンを完成させるために、機能を許可してこのパターンを有効にする簡単な方法があるかどうか誰か教えてもらえますか? プロパティとゲッターを追加するのが最も簡単な方法のように思えますが、それが最適ですか?intenumswitch-caseifswitch-caseifswitch-caseint

于 2010-08-19T13:47:11.007 に答える