需要使用Enum

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

任何人都可以用高级枚举的示例代码给出一些实际例子吗? 哪个可以清楚阐述

在哪里我们应该避免类,而应该使用枚举

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

试试这个例子 :

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

使用常量时通常使用枚举。 它们充当为常量提供一种类型,而不是像它们在引入之前那样将它们“松散”为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是否映射到常量,等等。在这种情况下提供干净简便的方法。

你可以认为这是一个现实世界的例子 –

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

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

您应该查看有效Java(第2版)的 Chapter 6 Enums and Annotations (也许是Java Enum的最佳实践) ,本书的作者( Joshua Bloch )也是JDK的Enum , EnumSet , EnumMap的作者 。

或者你可以看一下Joshua Bloch的会议,其中一个:
– Google I / O 2008 – 有效的Java重新加载
– 有效的Java – 在这些年后仍然有效

看看这个以及其他一些

带构造函数的枚举器

 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应优先于class使用的最简单示例是单例

 enum Singleton { INSTANCE } 

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

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


对于实用程序类,我使用enum ,但这并不常见。

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

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

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