需要使用Enum

时间:2011-05-11 04:10:35

标签: java enums

我很清楚在java中使用enum的高级功能。我们也很清楚许多区别于常规课程并告诉他们需要的要点。

任何人都可以提供一些高级枚举示例代码的实际示例吗?哪个可以清楚地阐述

  

我们应该避免上课和   应该使用枚举

请不要困惑。我不是要求如何使用枚举或枚举的用途。对此有很多问题和答案。我正在寻找一些实时/实时/实际的例子,我们应该避免使用任何其他数据类型。

8 个答案:

答案 0 :(得分:3)

通常在使用常量时使用枚举。它们充当为常量提供类型,而不是像intString那样将它们“松散”,就像它们被引入之前一样。

而不是说:

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

你可以说

  public enum Gender {
     MALE, FEMALE;
   } 

并将其称为Gender.MALEGender.FEMALE

如果没有枚举,setGender的方法需要接受int(在上面的示例中),我可以传递除1或2以外的任何内容。那里的代码需要检查是否int传递映射到常量等。在这种情况下,枚举提供了一种简洁明了的方法。

答案 1 :(得分:3)

您可以将此视为真实世界的示例 -

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

(我假设你知道枚举的所有基础知识......所以,我不在这里解释它们)

答案 2 :(得分:2)

尝试this example

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

    }
}

答案 3 :(得分:1)

答案 4 :(得分:1)

你应该看看Chapter 6 Enums and Annotations的{​​{1}}(也许是Java Enum的最佳实践),本书的作者( Joshua Bloch )也是JDK的作者{{} 3}},Effective Java (2nd Edition)Enum

或者你可以看一下Joshua Bloch的会议,其中一个:
- EnumSet
- EnumMap

答案 5 :(得分:1)

查看此内容以及其他一些

带构造函数的枚举

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
}

}

你永远不能直接调用枚举构造函数。使用您在常量值之后定义的参数自动调用枚举构造函数。

您可以为构造函数定义多个参数,并且可以重载枚举构造函数,就像重载普通类构造函数一样。

答案 6 :(得分:1)

enum应优先使用class的最简单示例是单身

enum Singleton {
   INSTANCE
}

实例是延迟加载和线程安全的,因为类被延迟加载并且它们的初始化是线程安全的。

这比使用常规类简单得多。


对于实用工具类,我使用enum井,但这并不常见。

enum Utility {;
   public static returnType utilityMethod(args) { ... }
}

答案 7 :(得分:0)

当您知道值是明确定义的时,修复了在编译时已知的值集。

您可以非常轻松地使用枚举(使用EnumSet),它允许您定义行为,按名称引用元素,打开它们等。