初学Java,枚举类(二十二)
来源:互联网 发布:java工作日报 编辑:程序博客网 时间:2024/06/18 18:03
Java的枚举类比C#枚举类更像类一点,因为它还可以定义属性和方法
01.public enum Gender 02.{ 03. MALE,FEMALE; 04. private String name; 05. public void setName(String name) 06. { 07. switch(this) 08. { 09. case MALE: 10. if(name.equals("男")) 11. { 12. this.name = name; 13. } 14. else 15. { 16. System.out.println("参数错误"); 17. return; 18. } 19. break; 20. case FEMALE: 21. if(name.equals("女")) 22. { 23. this.name = name; 24. } 25. else 26. { 27. System.out.println("参数错误"); 28. return; 29. } 30. break; 31. } 32. } 33. public String getName() 34. { 35. return this.name; 36. } 37.}
01.<pre class="java" name="code">public class TestGender 02.{ 03. public static void main(String[] args) 04. { 05. Gender g = Enum.valueOf(Gender.class,"FEMALE"); 06. g.setName("女"); 07. System.out.println(g + "代表:" + g.getName()); 08. //此时设置 name 属性时将会提示参数错误码 09. g.setName("男"); 10. System.out.println(g + "代表:" + g.getName()); 11. } 12.}</pre><br><strong>对枚举类来说,应该设计成不可变类,因此上面的属性值不应该允许改变,这样是不安全的,因此对属性应使用final修饰符,必须在构造器里为这些属性指定初始值,因此应该为枚举类显式定义带参数的构造器MALE,FEMALE 这些枚举值代表枚举类的所有可能实例,所以MALE(参数),就等同于调用构造器,类实例(参数)</strong>
01.MALE("男"),FEMALE("女")这样的写法确实给人一种怪异的感觉<pre style="background-color: rgb(255, 255, 255);" class="java" name="code"><pre class="java" name="code">public enum Gender 02.{ 03. //此处的枚举值必须调用对应构造器来创建 04. MALE("男"),FEMALE("女"); 05. private final String name; 06. //枚举类的构造器只能使用private修饰 07. private Gender(String name) 08. { 09. this.name = name; 10. } 11. public String getName() 12. { 13. return this.name; 14. } 15.}</pre><br><pre class="java" name="code">public class TestGender 16.{ 17. public static void main(String[] args) 18. { 19. Gender g = Enum.valueOf(Gender.class,"FEMALE"); 20. System.out.println(g + "代表:" + g.getName()); 21. 22. g = Enum.valueOf(Gender.class,"MALE"); 23. System.out.println(g + "代表:" + g.getName()); 24. } 25.}</pre>现在客户端不再有修改枚举类属性的权力了,呵呵</pre><strong>枚举类还可以实现一个或多个接口,C#的枚举类不支持这种做法</strong>
01.<pre class="java" name="code">public interface GenderDesc 02.{ 03. void info(); 04.} 05. 06. 07.public enum Gender implements GenderDesc 08.{ 09. //此处的枚举值必须调用对应构造器来创建 10. MALE("男") 11. //花括号部分实际上是一个类体部分 12. { 13. public void info() 14. { 15. System.out.println("这个枚举值代表男性"); 16. } 17. }, 18. FEMALE("女") 19. { 20. public void info() 21. { 22. System.out.println("这个枚举值代表女性"); 23. } 24. }; 25. private final String name; 26. private Gender(String name) 27. { 28. this.name = name; 29. } 30.} 31.</pre><br>当创建MALE和FEMALE两个枚举值时,后面又跟着一对花括号,括号里又包含一个info方法定义.括号部分实际是一个类体部分,当创始MALE,FEMALE枚举值时,并不是直接创建了Gender枚举类实例,而是相当于创建Gender的匿名子类实例.所以这个部分与匿名内部类语法大致相似.
编译生成三个文件Gender.class,Gender$1.class,Gender$2.class,和之前内部类的生成名字结构一样,证明了以上结论,MALE和FEMALE是Gender匿名子类的实例,而不是Gender类的实例
枚举类可包含抽象方法,当然这个C#也是不支持的
01.<pre class="java" name="code">public enum Operation 02.{ 03. PLUS 04. { 05. public double eval(double x,double y) 06. { 07. return x + y; 08. } 09. }, 10. MINUS 11. { 12. public double eval(double x,double y) 13. { 14. return x - y; 15. } 16. }, 17. TIMES 18. { 19. public double eval(double x,double y) 20. { 21. return x*y; 22. } 23. }, 24. DIVIDE 25. { 26. public double eval(double x,double y) 27. { 28. return x/y; 29. } 30. }; 31. //为枚举类定义一个抽象方法,这个抽象方法由不同枚举值提供不同的实现 32. public abstract double eval(double x,double y); 33. public static void main(String[] args) 34. { 35. System.out.println(Operation.PLUS.eval(3,4)); 36. System.out.println(Operation.MINUS.eval(5,4)); 37. System.out.println(Operation.TIMES.eval(5,4)); 38. System.out.println(Operation.DIVIDE.eval(5,4)); 39. } 40.} 41.</pre><br><br><p></p>
0 0
- 初学Java,枚举类(二十二)
- 初学Java,枚举类(二十二)
- 初学Java枚举类
- java学习笔记<十二>枚举类
- java枚举:初学(2)
- Java学习系列(二十二)Java面向对象之枚举详解
- java枚举:初学(1)
- 二十二 Swift3.0之 枚举
- 初学Java,集合类概述(二十五)
- 初学Java,集合类概述(二十五)
- 初学JAVA之二
- java知识总结(十二)枚举
- 初学Android,使用属性(Attribute)资源(二十二)
- Java枚举(二)
- java枚举应用(二)
- JAVA学习总结二十二
- java ClassLoader 类加载器(二十二)
- java学习初探十二之常用类_数字_随机数_枚举
- cocos2d-x3.0 相对布局(一)
- java socket 多线程
- CM之过程总览
- maven下载及环境设置备忘
- Hibernate(二)
- 初学Java,枚举类(二十二)
- C#网络编程 异步
- epoll的原理
- configure.ac:20: error: Autoconf version 2.65 or higher is required
- hashCode与equals的区别与联系
- SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
- Xcode 自动加Comment插件:VVDocumenter-Xcode
- IOS之缩放图片
- Ubuntu 13.10 eclipse后菜单栏下拉菜单无法显示