2010-08-19 4 views
3

как я могу сделать, чтобы имитировать класс типа enum в java < 5.0 .. ??Имитировать класс типа enum

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)); 
    } 
} 

ответ

0

Joshua Bloch показывает вам, как в первом выпуске его «Эффективной Java». Мне нужно идти на работу, поэтому я не могу сейчас вводить детали. Больше следовать.

+0

thx для вашего ответа;) – Mercer

+0

Спустя семь лет после факта, и теперь это проголосовали? Модераторы, обратите внимание. – duffymo

4

Используйте типизированное перечисление, описанное в эффективной java. Вот пример, приведенный в Joshua Blochs article on this:

// 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.

+1

добавить equals и поддержку hashCode :) – helios

+0

thx, так как это работает. Если я сделаю это Костюм («лопаты») Что я получу .. ?? – Mercer

+0

@helios, управляя подобной конструкцией, метод equals эквивалентен использованию '==', так как будет только один экземпляр каждого отдельного Suit. – krock

0

Решение Крок и Riduidel предполагают довольно аккуратный, но AFAIK switch-case утверждение не представляется возможным, поскольку это применимо только для конвертируемых int значения и enum константы. switch-case комбинация хорошая характеристика, более читаемая, чем пучок if s (BTW: switch-case будет скомпилирован как связка if s в любом случае, правильно?). Итак, чтобы завершить обсуждаемый шаблон, может ли кто-нибудь сказать, есть ли быстрый способ включить этот компонент с функциональностью, позволяющей switch-case? Добавление свойства int и getter для него кажется самым простым способом, но оптимально ли это?