Java总结(2)枚举

一.枚举的作用

      一些程序在运行时,需要的数据不是任意的,而必须是一定范围内的值,jdk5以前采用自定义类来解决,jdk5以后可以直接采用枚举。

二.jdk5通过新增的enum关键字用于定义一个枚举类。

一个简单的枚举类
        enum Grade{  
                   A,B,C,D,E;
         }

三.枚举类可有有构造函数,字段和方法。

带构造函数的枚举

      enum Grade{
                   A("100-60"),B("59-0");//构造函数初始化对象
                   private String value;//表示每个对象对应的分数
                   private Grade(Stringvalue){      //枚举的构造函数必须是私有的
                            this.value = value;
                   }
         }

带方法的枚举

         enum Grade{
                   
                   A("100-60"),B("59-0");//构造函数初始化对象
                   private String value;//表示每个对象对应的分数
                   private Grade(Stringvalue){      //枚举的构造函数必须是私有的
                   this.value = value;
                   }
                   public String getValue(){
                            return this.value;
                   }
         }

测试代码
        
 public void print(Gradeg){
                   String value =g.localValue;
                   System.out.println(value);
         }
         public void test(){
                   print(Grade.A);
         }


运行结果  
100-60


枚举的常见的用法:

用法一:常量

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

public enum Color {
        RED, GREEN, BLANK, YELLOW
}

用法二:switch

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。 
enum Signal {
        GREEN, YELLOW, RED
}
public class TrafficLight {
        Signal color = Signal.RED;
        public void change() {
                switch (color) {
                        case RED:
                                color = Signal.GREEN;
                                break;
                        case YELLOW:
                                color = Signal.RED;
                                break;
                        case GREEN:
                                color = Signal.YELLOW;
                                break;
                }
        }
}


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

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。
public enum Color {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;
        // 构造方法
        private Color(String name, int index) {
                this.name = name;
                this.index = index;
        }
        // 普通方法
        public static String getName(int index) {
                for (Color c : Color.values()) {
                        if (c.getIndex() == index) {
                                return c.name;
                        }
                }
                return null;
        }
        // get set 方法
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getIndex() {
                return index;
        }
        public void setIndex(int index) {
                this.index = index;
        }
} 


用法四:覆盖枚举中的方法

下面给出一个toString()方法覆盖的例子
public enum Color {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;
        // 构造方法
        private Color(String name, int index) {
                this.name = name;
                this.index = index;
        }
        //覆盖方法
        @Override
        public String toString() {
                return this.index+"_"+this.name;
        }    
}


用法五:实现接口

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
public interface Behaviour {
        void print();
                String getInfo();
}
public enum Color implements Behaviour{
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;
        // 构造方法
        private Color(String name, int index) {
                this.name = name;
                this.index = index;
        }
        //接口方法
        @Override
        public String getInfo() {
                return this.name;
        }
        //接口方法
        @Override
        public void print() {
                System.out.println(this.index+":"+this.name);
        }
} 

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

public interface Food {
        enum Coffee implements Food{
                BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
        }
        enum Dessert implements Food{
                FRUIT, CAKE, GELATO
        }
}

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

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。
API文档为:
构造方法 protected Enum(String name, int ordinal) 
                  单独的构造方法。
方法摘要 
protected  Object  clone() 抛出 CloneNotSupportedException
int                compareTo(E o) 比较此枚举与指定对象的顺序。
boolean            equals(Object other) 当指定对象等于此枚举常量时,返回 true。
protected  void    finalize() 枚举类不能有 finalize 方法。
Class<E>           getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象。
int                hashCode() 返回枚举常量的哈希码。
String             name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。
int                ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String             toString() 返回枚举常量的名称,它包含在声明中。
static<T extends Enum<T>> T      valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。
-----------------------------------------------------------------------------------------------------
代码演示:
public class TestEnum {
        /*最普通的枚举*/
        public enum ColorSelect {
                red, green, yellow, blue;    
        }
        /* 枚举也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样. */
        public enum Season {
                // 枚举列表必须写在最前面,否则编译出错
                winter, spring, summer, fall;
                private final static String location = "Phoenix";        
                public static Season getBest() {
                        if (location.equals("Phoenix"))
                                return winter;
                        else
                                return summer;
                }
        }
        /*还可以有构造方法*/
        public enum Temp {
                /*通过括号赋值,而且必须有带参构造器和一属性跟方法,否则编译出错
                * 赋值必须是都赋值或都不赋值,不能一部分赋值一部分不赋值
                * 如果不赋值则不能写构造器,赋值编译也出错*/
                absoluteZero(-459), freezing(32),boiling(212), paperBurns(451);
                private final int value;
                public int getValue() {
                        return value;
                }
                //构造器默认也只能是private, 从而保证构造函数只能在内部使用
                Temp(int value) {
                        this.value = value;
                }
        }
        public static void main(String[] args) {
        /*
        * 枚举类型是一种类型,用于定义变量,以限制变量的赋值 赋值时通过"枚举名.值"来取得相关枚举中的值
        */
                ColorSelect m = ColorSelect.blue;
                switch (m) {
                        /*注意:枚举重写了ToString(),说以枚举变量的值是不带前缀的
                        *所以为blue而非ColorSelect.blue
                        */
                        case red:
                                System.out.println("color is red");
                                break;
                        case green:
                                System.out.println("color is green");
                                break;
                        case yellow:
                                System.out.println("color is yellow");
                                break;
                        case blue:
                                System.out.println("color is blue");
                                break;
                }
                System.out.println("遍历ColorSelect中的值");
                /*通过values()获得枚举值的数组*/
                for (ColorSelect c : ColorSelect.values()) {
                        System.out.println(c);
                }   
                System.out.println("枚举ColorSelect中的值有:"+ColorSelect.values().length+"个");
                /*ordinal()返回枚举值在枚举中的索引位置,从0开始*/
                System.out.println(ColorSelect.red.ordinal());//0
                System.out.println(ColorSelect.green.ordinal());//1
                System.out.println(ColorSelect.yellow.ordinal());//2
                System.out.println(ColorSelect.blue.ordinal());//3
                /*枚举默认实现了java.lang.Comparable接口*/ 
                System.out.println(ColorSelect.red.compareTo(ColorSelect.green));
                System.out.println(Season.getBest());
        
                for(Temp t:Temp.values()){
                        /*通过getValue()取得相关枚举的值*/
                        System.out.println(t+"的值是"+t.getValue());
                }
        }
} 

总结:

枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值