需要使用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(); } }
使用常量时通常使用枚举。 它们充当为常量提供一种类型,而不是像它们在引入之前那样将它们“松散”为int
或String
。
而不是说:
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
是否映射到常量,等等。在这种情况下提供干净简便的方法。
你可以认为这是一个现实世界的例子 –
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
),它允许您定义行为,按名称引用元素,打开它们等。