黑马程序员_枚举总结
2014-01-02 15:39
253 查看
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、枚举的作用
1,问题的由来
要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。因此需要一种机制对这种类型的变量进行限制,使变量的取值只能为若干个固定值中的一个,这样就避免了错误的发生,而枚举的出现解决了这方面的问题。
2,枚举的理解
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
因而可以总结为枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。
二、用普通的类模拟枚举类
1,定义一个枚举类MyWeekday
2,定义一个类EumerationTest,当我们在使用MyWeekDay时只能使用其预先定义的数据,即采用类名调用的方式。下面程序使用MyWeekDay时,将星期定义为FRI,当调用nextDay方法时返回下一天,打印SAT
3,总结利用普通类模拟枚举类的步骤
3.1,将类的构造函数私有,外部使用者不能创建对象
3.2,创建若干本类对象,供为外部使用者使用,对象声明为public,static,final。
3.3,可以根据需求为枚举类定义若干方法。
4,MyWeekDay中nextDay方法存在大量if-else语句,可通过内名内部类的形式将其转移到每个子类实例中,那么可将该方法声明为抽象,让子类实现,将MyWeekDay声明为抽象类。
三、利用enum关键字定义枚举
1,定义枚举类注意事项
1.1,定义的枚举类元素应用分号分隔开来,且定义的元素应在枚举类最前面,即定义的元素前面不能有内容
1.2,当枚举类中定义其它内容时,最后的元素结尾处应以分号结束
2,枚举类示例WeekDay
四、实现带有构造函数的枚举类
1,构造函数放在所有成员之后
2,构造函数声明为private
Weekday提供了两个构造函数,和普通的类的构造函数一样,会为相应的对象进行初始化,当使用Weekday时,会打SUN对象会调用WeekDay(int i)这个构造函数打印second,而其它的对象会调用WeekDay()打印first。
五、实现带有抽象方法的枚举
实现带有抽象方法的枚举可以从以下几方面着手
1,定义成员
2,定义抽象方法
3,为每个成员添加{},并在其中复写抽象方法
4,根据需要定义其它内容,如枚举类的成员变量,方法等
六,枚举与单例设计模式
当枚举只有一个成员时,就可以作为一种单例的实现方式。
1,一种单例设计方式
2,枚举实现单例
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>
一、枚举的作用
1,问题的由来
要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。因此需要一种机制对这种类型的变量进行限制,使变量的取值只能为若干个固定值中的一个,这样就避免了错误的发生,而枚举的出现解决了这方面的问题。
2,枚举的理解
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
因而可以总结为枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。
二、用普通的类模拟枚举类
1,定义一个枚举类MyWeekday
public class MyWeekDay { private MyWeekDay(){} public static final MyWeekDay SUN = new MyWeekDay(); public static final MyWeekDay MON = new MyWeekDay(); public static final MyWeekDay TUE = new MyWeekDay(); public static final MyWeekDay WED = new MyWeekDay(); public static final MyWeekDay THI = new MyWeekDay(); public static final MyWeekDay FRI = new MyWeekDay(); public static final MyWeekDay SAT = new MyWeekDay(); public MyWeekDay nextDay(){ if(this == SUN) return MON; else if(this == MON) return TUE; else if(this == MON) return TUE; else if(this == TUE) return WED; else if(this == WED) return THI; else if(this == THI) return FRI; else if(this == FRI) return SAT; else return SUN; } public String toString(){ if(this == SUN) return "SUN"; else if(this == MON) return "MON"; else if(this == TUE) return "TUE"; else if(this == WED) return "WED"; else if(this == THI) return "THI"; else if(this == FRI) return "FRI"; else return "SAT"; } }
2,定义一个类EumerationTest,当我们在使用MyWeekDay时只能使用其预先定义的数据,即采用类名调用的方式。下面程序使用MyWeekDay时,将星期定义为FRI,当调用nextDay方法时返回下一天,打印SAT
public class EumerationTest { public static void main(String[] args) { MyWeekDay weekDay = MyWeekDay.FRI; System.out.println(weekDay.nextDay()); } }
3,总结利用普通类模拟枚举类的步骤
3.1,将类的构造函数私有,外部使用者不能创建对象
3.2,创建若干本类对象,供为外部使用者使用,对象声明为public,static,final。
3.3,可以根据需求为枚举类定义若干方法。
4,MyWeekDay中nextDay方法存在大量if-else语句,可通过内名内部类的形式将其转移到每个子类实例中,那么可将该方法声明为抽象,让子类实现,将MyWeekDay声明为抽象类。
public abstract class MyWeekDay { private MyWeekDay(){} public static final MyWeekDay SUN = new MyWeekDay(){ @Override public MyWeekDay nextDay() { // TODO Auto-generated method stub return MON; } }; public static final MyWeekDay MON = new MyWeekDay(){ @Override public MyWeekDay nextDay() { // TODO Auto-generated method stub return TUE; } }; public static final MyWeekDay TUE = new MyWeekDay(){ @Override public MyWeekDay nextDay() { // TODO Auto-generated method stub return WED; } }; public static final MyWeekDay WED = new MyWeekDay(){ @Override public MyWeekDay nextDay() { // TODO Auto-generated method stub return THI; } }; public static final MyWeekDay THI = new MyWeekDay(){ @Override public MyWeekDay nextDay() { // TODO Auto-generated method stub return FRI; } }; public static final MyWeekDay FRI = new MyWeekDay(){ @Override public MyWeekDay nextDay() { // TODO Auto-generated method stub return SAT; } }; public static final MyWeekDay SAT = new MyWeekDay(){ @Override public MyWeekDay nextDay() { // TODO Auto-generated method stub return SUN; } }; public abstract MyWeekDay nextDay(); public String toString(){ if(this == SUN) return "SUN"; else if(this == MON) return "MON"; else if(this == TUE) return "TUE"; else if(this == WED) return "WED"; else if(this == THI) return "THI"; else if(this == FRI) return "FRI"; else return "SAT"; } }
三、利用enum关键字定义枚举
1,定义枚举类注意事项
1.1,定义的枚举类元素应用分号分隔开来,且定义的元素应在枚举类最前面,即定义的元素前面不能有内容
1.2,当枚举类中定义其它内容时,最后的元素结尾处应以分号结束
2,枚举类示例WeekDay
public enum WeekDay { SUN,MON,TUE,WED,THI,FRI,SAT; }
WeekDay wDay = WeekDay.FRI; System.out.println(wDay.ordinal());//打印5,
四、实现带有构造函数的枚举类
1,构造函数放在所有成员之后
2,构造函数声明为private
public enum WeekDay { SUN(1),MON,TUE,WED,THI,FRI,SAT; private WeekDay(){ System.out.println("first"); } private WeekDay(int i){ System.out.println("second"); } }
Weekday提供了两个构造函数,和普通的类的构造函数一样,会为相应的对象进行初始化,当使用Weekday时,会打SUN对象会调用WeekDay(int i)这个构造函数打印second,而其它的对象会调用WeekDay()打印first。
五、实现带有抽象方法的枚举
实现带有抽象方法的枚举可以从以下几方面着手
1,定义成员
2,定义抽象方法
3,为每个成员添加{},并在其中复写抽象方法
4,根据需要定义其它内容,如枚举类的成员变量,方法等
public enum WeekDay { SUN{ @Override public 4000 WeekDay nextDay() { // TODO Auto-generated method stub return MON; } }, MON{ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return TUE; } }, TUE{ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return WED; } }, WED{ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return THI; } }, THI{ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return FRI; } }, FRI{ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return SAT; } }, SAT{ @Override public WeekDay nextDay() { // TODO Auto-generated method stub return SUN; } }; private WeekDay(){ System.out.println("first"); } public abstract WeekDay nextDay(); }
六,枚举与单例设计模式
当枚举只有一个成员时,就可以作为一种单例的实现方式。
1,一种单例设计方式
class Single { private static final Single s = new Single(); private Single(){} public static Single getInstance() { return s; } }
2,枚举实现单例
public enum Single{ SINGLE; }
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>
相关文章推荐
- 黑马程序员:Java基础总结----枚举
- 黑马程序员 知识点总结-Java JDK 1.5 新特性和枚举
- 黑马程序员——枚举学习总结
- 黑马程序员—枚举、结构、常量日志总结
- 黑马程序员_总结跳转语句、枚举类型、结构体类型、类以及值类型和引用类型的区别
- 黑马程序员之ios学习总结——07 C语言的枚举、预处理指令
- 黑马程序员_iOS开发C语言基础之枚举类型和数据类型总结
- 黑马程序员——C语言知识点总结之结构体和枚举
- 黑马程序员__JAVA高新技术--枚举及内省JavaBean、可变参数等知识点总结
- 黑马程序员-java枚举总结
- 黑马程序员_Java中的枚举总结
- 黑马程序员,枚举总结
- 黑马程序员 《ios零基础教程》--全局和局部变量、结构体、枚举 2014-4-2总结
- 黑马程序员--枚举,反射学习及其总结
- 黑马程序员_内省&注解&枚举知识总结
- 黑马程序员有关枚举,反射,泛型的总结
- 黑马程序员——关于常量、枚举、结构、异常的总结笔记
- 黑马程序员_JAVA_枚举和反射总结
- 黑马程序员_枚举和泛型总结
- 黑马程序员 枚举数和迭代器 总结