Нужно использовать Enum - PullRequest
2 голосов
/ 11 мая 2011

Я ясно, с расширенным использованием enum в Java. Многие из пунктов, которые отличают их от обычных занятий и говорят об их необходимости, также мне ясны.

Может ли кто-нибудь привести практический пример с примером кода для расширенного перечисления? Который может четко уточнить о

где мы должны избегать занятий и следует использовать enum вместо

.

Пожалуйста, не смущайтесь. Я не спрашиваю, как использовать enum или как использовать enum. На это есть много вопросов и ответов. Я ищу какой-нибудь реальный / живой / практический пример, где нам следует избегать любых других типов данных или классов.

Ответы [ 8 ]

3 голосов
/ 11 мая 2011

Перечисления обычно используются при использовании констант.Они действуют как обеспечивающие тип для константы, а не оставляют их «свободными» как int s или String s, как это было сделано до того, как они были введены.

Вместо того, чтобы говорить:

public static final int MALE = 1;
public static final int FEMALE = 2;

Вы можете сказать

  public enum Gender {
     MALE, FEMALE;
   } 

и обращаться к ним как Gender.MALE и Gender.FEMALE.

Без перечислений метод к setGender должен приниматьint (в приведенном выше примере), и я могу передать что-либо, кроме 1 или 2. Затем код должен проверить, соответствует ли передаваемый int константе и т. Д. Перечисления обеспечивают простой и понятный способтакие ситуации.

3 голосов
/ 11 мая 2011

Вы можете рассмотреть это как пример из реального мира -

public class EnumExample
{
    public static  enum APP_STATUS{
        ALL_GOOD(1, "All things are going good"),
        WARNING(2, "SOMETHING IS BAD"),
        ERROR(3, "Its an Error"),
        FATAL(4, "Its crashed");

        private String  statusMessage;
        private int statusId;
        private APP_STATUS(int statusId, String statusMessage){
            this.statusId = statusId;
            this.statusMessage = statusMessage;
        }

        public int getStatusId(){
            return statusId;
        }

        public String getStatusMessage(){
            return statusMessage;
        }

        public boolean isAttentionRequired(){
            if(statusId<3)
                return false;
            else
                return true;
        }
    }

    public void handleAppStatusChange(APP_STATUS newStatus){
        if(newStatus.isAttentionRequired()){
            //notify admin
        }
        //Log newStatus.getStatusId() in the logfile
        //display newStatus.getStatusMessage() to the App Dash-Board
    }

    public void Test(){
        handleAppStatusChange(APP_STATUS.ALL_GOOD);
        handleAppStatusChange(APP_STATUS.WARNING);
        handleAppStatusChange(APP_STATUS.FATAL);
    }
}

(я предполагаю, что вы знаете все основы enum ... и поэтому я не буду здесь их объяснять)

2 голосов
/ 11 мая 2011

Попробуйте этот пример :

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

Использование:

public class EnumTest {
    Day day;

    public EnumTest(Day day) {
        this.day = day;
    }

    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY: System.out.println("Mondays are bad.");
                         break;

            case FRIDAY: System.out.println("Fridays are better.");
                         break;

            case SATURDAY:
            case SUNDAY: System.out.println("Weekends are best.");
                         break;

            default:     System.out.println("Midweek days are so-so.");
                         break;
        }
    }

    public static void main(String[] args) {
        EnumTest firstDay = new EnumTest(Day.MONDAY);
        firstDay.tellItLikeItIs();
        EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
        thirdDay.tellItLikeItIs();
        EnumTest fifthDay = new EnumTest(Day.FRIDAY);
        fifthDay.tellItLikeItIs();          

    }
}
1 голос
/ 11 мая 2011

Простейшим примером использования enum вместо предпочтения class является синглтон

enum Singleton {
   INSTANCE
}

Экземпляры загружаются лениво и безопасны для потоков, потому что классы загружаются лениво, а их инициализация является поточно-ориентированной.

Это намного проще, чем использовать обычный класс.


Для служебного класса я использую enum, но это не так часто.

enum Utility {;
   public static returnType utilityMethod(args) { ... }
}
1 голос
/ 11 мая 2011

Проверьте это также некоторые дополнительные

Перечисления с конструкторами

enum enumConstr {
HUGE(10), OVERWHELMING(16), BIG(10,"PONDS");//(;)Compulsory

int ounces; String name;
enumConstr(int ounces){ this.ounces = ounces; }

enumConstr(int ounces,String name){
    this.ounces = ounces;
    this.name = name;
}

public int getOunces(){  return ounces; }
public String getName(){ return name; }
}//Enum completes

public class EnumWithConstr {
enumConstr size;

public static void main(String[] args) {
    EnumWithConstr constr = new EnumWithConstr();
    constr.size = enumConstr.BIG;

    EnumWithConstr constr1 = new EnumWithConstr();
    constr1.size = enumConstr.OVERWHELMING;

    System.out.println(constr.size.getOunces());//8
    System.out.println(constr1.size.getOunces());//16
    System.out.println(constr.size.getName());//PONDS
    System.out.println(constr1.size.getName());//null
}

}

 Вы НИКОГДА не можете вызывать конструктор перечисления напрямую.Конструктор enum вызывается автоматически с аргументами, которые вы определяете после значения константы.

 Для конструктора можно указать более одного аргумента, и вы можете перегрузить конструкторы перечисления так же, как вы можете перегрузить обычныйконструктор класса.

1 голос
/ 11 мая 2011

Вы должны взглянуть на Chapter 6 Enums and Annotations (может быть, лучшие практики для Java Enum) из Effective Java (2nd Edition) , автор ( Джошуа Блох ) этой книги также является автором Enum , EnumSet , EnumMap JDK.

Или вы можете посмотреть на конференцию Джошуа Блоха:
- Google I / O 2008 - Effective Java Reloaded
- Effective Java - все еще эффективенПосле всех этих лет

1 голос
/ 11 мая 2011
0 голосов
/ 11 мая 2011

Когда вы знаете, что значения четко определены, фиксированный набор значений, которые известны во время компиляции.

Вы можете очень легко использовать enum как набор (с EnumSet), и это позволяет вам определять поведение, ссылаться на элементы по имени, включать их и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...