Java中的枚举

一、定义:实际上类似一个普通的java类,但在这个java类中被赋予了一种规范,在枚举中所有的元素都被设置为final常量,构造方法设置成为私有化。也就是把自己的所有成分封装起来。(答案非常不全面)
较为全面的:
     Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。     
    
     1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。     
    
     2.所有枚举值都是public    ,    static    ,    final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义    变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。     
    
     3.Enum默认实现了java.lang.Comparable接口。     
    
     4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.     
    
     5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。     
    
     6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。     
    
     7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。     
    
     了解了这些基本特性,我们来看看如何使用它们。     
    
     1.遍历所有有枚举值.    知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。     
    
     for    (Color    c:    Color.values())     
     System.out.println(“find    value:”    +    c);     
    
     2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。     
    
     public    enum    Color    {     
     Red,     
     Green,     
     Blue;     
    
     /*     
     *定义一个变量表示枚举值的数目。     
     *(我有点奇怪为什么sun没有给enum直接提供一个size方法).     
     */     
     private    static    int    number    =    Color.values().length    ;     
    
     /**     
     *    随机返回一个枚举值     
     @return    a    random    enum    value.     
     */     
     public    static    Color    getRandomColor(){     
     long    random    =    System.currentTimeMillis()    %    number;     
     switch    ((int)    random){     
      case    0:     
       return    Color.Red;     
      case    1:     
       return    Color.Green;     
      case    2:     
       return    Color.Blue;     
      default    :    return    Color.Red;     
     }     
     }     
     }     
    
     可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。     
    
     3.覆载(Override)toString,    valueOf方法     
    
     前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。     
    
     ….     
     public    String    toString(){     
     switch    (this){     
     case    Red:     
      return    "Color.Red";     
     case    Green:     
      return    "Color.Green";     
     case    Blue:     
      return    "Color.Blue";     
     default:     
      return    "Unknow    Color";     
     }     
     }     
     ….     
    
     这时我们可以看到,此时再用前面的遍历代码打印出来的是     
    
     Color.Red     
     Color.Green     
     Color.Blue     
    
     而不是     
    
     Red     
     Green     
     Blue.     
    
     可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。     
    
     4.使用构造函数     
    
     虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。     
    
     public    enum    Color    {     
     Red("This    is    Red"),     
     Green("This    is    Green"),     
     Blue("This    is    Blue");     
    
     private    String    desc;     
    
     Color(String    desc){     
     this.desc    =    desc;     
     }     
    
     public    String    getDesc(){     
     return    this.desc;     
     }     
    
     }     
    
     这里我们为每一个颜色提供了一个说明信息,    然后定义了一个构造函数接受这个说明信息。     
    
     要注意这里构造函数不能为public或者protected,    从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public    static    final的常量而已。     
    
     5.实现特定的接口     
    
     我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。     
    
     6.定义枚举值自己的方法。     
    
     前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载    toString的例子可以被改写成这样。     
    
     public    enum    Color    {     
     Red    {     
     public    String    toString(){     
      return    "Color.Red";     
     }     
     },     
     Green    {     
     public    String    toString(){     
      return    "Color.Green";     
     }     
     },     
     Blue{     
     public    String    toString(){     
      return    "Color.Blue";     
     }     
     };     
     }     
    
     从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。     
    
     总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个

人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。

二、Java枚举常见的其中用法:
     

JDK1.5引入了新的类型——枚举。在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便。

用法一:常量

在JDK1.5之前,我们定义常量都是:publicstaticfianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

Java代码   复制代码
  1. public enum Color {
  2. RED, GREEN, BLANK, YELLOW
  3. }

用法二:switch

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

Java代码  
  1. enum Signal {
  2. GREEN, YELLOW, RED
  3. }
  4. public class TrafficLight {
  5. Signal color = Signal.RED;
  6. public void change() {
  7. switch (color) {
  8. case RED:
  9. color = Signal.GREEN;
  10. break;
  11. case YELLOW:
  12. color = Signal.RED;
  13. break;
  14. case GREEN:
  15. color = Signal.YELLOW;
  16. break;
  17. }
  18. }
  19. }

用法三:向枚举中添加新方法

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且Java要求必须先定义enum实例。

Java代码  
  1. public enum Color {
  2. RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  3. // 成员变量
  4. private String name;
  5. private int index;
  6. // 构造方法
  7. private Color(String name, int index) {
  8. this.name = name;
  9. this.index = index;
  10. }
  11. // 普通方法
  12. public static String getName(int index) {
  13. for (Color c : Color.values()) {
  14. if (c.getIndex() == index) {
  15. return c.name;
  16. }
  17. }
  18. return null;
  19. }
  20. // get set 方法
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public int getIndex() {
  28. return index;
  29. }
  30. public void setIndex(int index) {
  31. this.index = index;
  32. }
  33. }

用法四:覆盖枚举的方法

下面给出一个toString()方法覆盖的例子。

Java代码  
  1. public enum Color {
  2. RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  3. // 成员变量
  4. private String name;
  5. private int index;
  6. // 构造方法
  7. private Color(String name, int index) {
  8. this.name = name;
  9. this.index = index;
  10. }
  11. //覆盖方法
  12. @Override
  13. public String toString() {
  14. return this.index+"_"+this.name;
  15. }
  16. }

用法五:实现接口

所有的枚举都继承自java.lang.Enum类。由于Java不支持多继承,所以枚举对象不能再继承其他类。

Java代码  
  1. public interface Behaviour {
  2. void print();
  3. String getInfo();
  4. }
  5. public enum Color implements Behaviour{
  6. RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  7. // 成员变量
  8. private String name;
  9. private int index;
  10. // 构造方法
  11. private Color(String name, int index) {
  12. this.name = name;
  13. this.index = index;
  14. }
  15. //接口方法
  16. @Override
  17. public String getInfo() {
  18. return this.name;
  19. }
  20. //接口方法
  21. @Override
  22. public void print() {
  23. System.out.println(this.index+":"+this.name);
  24. }
  25. }

用法六:使用接口组织枚举

Java代码  
  1. public interface Food {
  2. enum Coffee implements Food{
  3. BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
  4. }
  5. enum Dessert implements Food{
  6. FRUIT, CAKE, GELATO
  7. }
  8. }

用法七:关于枚举集合的使用


java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seven的代码实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值