java 新特性 ----枚举(7)

来源:互联网 发布:e宠商城淘宝店 编辑:程序博客网 时间:2024/05/29 14:13

枚举

在有些情况下一个类的对象是有限而且固定的,例如季节类,他只有四个对象,正在如每星期的天数,他只有七天。这种实例有限而且固定的类,在java里面被称为枚举类。
1、使用简单程序完成枚举的功能:
代码:

package cn.com.zsc.day01;public class ColorTest {    public static void main(String[] args) {        Color c1 = Color.RED;    //取得红色        System.out.println(c1.getName());    //输出名字        Color c2 = Color.getInstance(3);    //根据编号取得名字        System.out.println(c2.getName());    //输出名字    }}class Color{    public static final Color RED = new Color("红色");    //定义第一个对象    public static final Color GREEN = new Color("绿色");    //定义第二个对象    public static final Color BLUE = new Color("蓝色");    //定义第三个对象    private String name ;        private Color(String name){    //构造方法私有化,同时设置颜色的名称        this.setName(name);    //为颜色名字赋值    }    public String getName() {    //取得颜色名字        return name;        }    public void setName(String name) {    //设置颜色名字        this.name = name;        }    public static Color getInstance(int i){    //得到一个颜色,只能从固定的几个颜色中获得        switch(i){                case 1:{                return RED ;    //返回红色            }            case 2:{                return GREEN ;    //返回绿色            }            case 3:{                return BLUE ;    //返回蓝色            }            default:{                return null ;            }        }    }}
运行结果:
红色蓝色

以上程序将Color 类中的构造方法私有了,之后在类中准备了若干个实例化对象,以后要取得Color 类的实例则只能用RED,GREEN,BLUE三个对象,这样就有效的控制了对象的取得范围。

2、定义一个枚举类:
声明枚举类型:
[public] enum 枚举类型名称{
    枚举对象 1,枚举对象 2,...,枚举对象 n;
}
定义一个Colors 的枚举类型:
package cn.com.zsc.day01;
public enum Colors {
    RED,GREEN,BLUE;
}
使用switch 进行判断输出颜色:
代码:
package cn.com.zsc.day01;public class SwitchPointColor {    public static void main(String[] args) {        for(Colors c:Colors.values()){            print(c);        }    }    private static void print(Colors colors) {        switch(colors){            case RED:{                System.out.println("红颜色");                break ;            }            case GREEN:{                System.out.println("绿颜色");                break ;            }            case BLUE:{                System.out.println("蓝颜色");                break ;            }        }    }}

运行结果:
红颜色绿颜色蓝颜色

上面的 Colors.values() 方法表示取得枚举类中的全部内容,返回的是一个数组对象,这是枚举类的本身支持的一个方法。

 3.1、取得枚举的信息
 在Enum 类的构造方法中的第一个参数name 就是定义的枚举的名称,第二个参数 ordinal 则会从 0 开始依次进行编号。之后可以使用Enum 提供的name() 和ordinal() 方法获取名称和编号。
 代码:
 
package cn.com.zsc.day01;public class GetEnumInfo {    public static void main(String[] args) {        for(Colors color:Colors.values()){            System.out.println(color.ordinal()+"---->"+color.name());        }    }}

运行结果:
0---->RED1---->GREEN2---->BLUE

3.2 、为每一个枚举对象赋值:
3.2.1 、通过构造方法为属性赋值:
每个枚举类中都有其指定好的若干对象,当然每一个枚举类对象中也可以包含多个属性。而这些属性也可以通过构造方法为其赋值。
通过构造方法为枚举元素赋值:
代码:
package cn.com.zsc.day01;public class ConstructorEnum {    public static void main(String args[]) {        for(Colorful c:Colorful.values()){            System.out.println(c.ordinal()+"--->"+c.name()+"("+c.getName()+")");        }    }}enum Colorful{    RED("红色"),GREEN("绿色"),BLUE("蓝色");    private Colorful(String name){        this.setName(name);    }    private String name ;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

运行结果:
0--->RED(红色)1--->GREEN(绿色)2--->BLUE(蓝色)

3.2.2 、 通过settet 方法为属性赋值
使用setName() 设置内容:
代码:
package cn.com.zsc.day01;public class SetEnum {    public static void main(String[] args) {        Colorfuls c = Colorfuls.BLUE;        c.setName("兰色");        c.setName("蓝色");        System.out.println(c.getName());    }}enum Colorfuls{    RED,BLUE,GREEN;    private String name ;    public String getName() {        return name;    }    public void setName(String name) {        switch(this){            case RED:{                if("红色".equals(name)){                    this.name = name ;                }else{                    System.out.println("内容错误");                }                break ;            }            case GREEN:{                if("绿色".equals(name)){                    this.name = name ;                }else{                    System.out.println("内容错误");                }                break ;            }            case BLUE:{                if("蓝色".equals(name)){                    this.name = name ;                }else{                    System.out.println("内容错误");                }                break ;            }        }    }}

运行结果:
内容错误蓝色

3.3 、使用比较器:
在Enum 类的定义中已经实现好了Comparable 接口,所以枚举类的内容本身是可以进行排序的。
验证枚举比较器:
代码:
package cn.com.zsc.day01;import java.util.Iterator;import java.util.Set;import java.util.TreeSet;public class ComparableEnum {    public static void main(String[] args) {        Set<Colorf> ts = new TreeSet<Colorf>();        ts.add(Colorf.GREEN);        ts.add(Colorf.BLUE);        ts.add(Colorf.RED);        Iterator<Colorf> iter = ts.iterator();        while(iter.hasNext()){            System.out.println(iter.next());        }    }}enum Colorf{    RED,BLUE,GREEN;}

运行结果:
REDBLUEGREEN

4、类对枚举的支持————EnumMap、EnumSet
4.1、EnumMap
EnumMap是Map 接口的子类,所以本身还是以Map 的形式进行操作的,即"kek--->value"。如果要使用EnumMap 则首先要创建EnumMap 对象,在创建对象时必须指定要操作的枚举类,构造方法如下:
public EnumMap(Class<K> kryType)

验证EnumMap
代码:
package cn.com.zsc.day01;import java.util.EnumMap;import java.util.Map;public class EnumMapTest {    public static void main(String[] args) {        Map<Co,String> desc = null ;        desc = new EnumMap<Co,String>(Co.class);        desc.put(Co.RED, "红色");        desc.put(Co.BLUE, "蓝色");        desc.put(Co.GREEN, "绿色");        System.out.println("====输出全部内容====");        for(Co c:Co.values()){            System.out.println(c.name()+"-->"+desc.get(c));        }        System.out.println("====输出全部的键值====");        for(Co c:desc.keySet()){            System.out.print(c.name()+"、");        }        System.out.println("====输出全部内容====");        for(String s:desc.values()){            System.out.print(s+"、");        }    }}enum Co{    RED,BLUE,GREEN;}

运行结果:
====输出全部内容====RED-->红色BLUE-->蓝色GREEN-->绿色====输出全部的键值====RED、BLUE、GREEN、====输出全部内容====红色、蓝色、绿色、

4.2、EnumSet
EnumSet是Set 接口的子类,所以里面的内容是无法重复的。使用EnumSet 时不能直接使用关键字new 为其进行实例化,而是使用本类中提供的静态方法。
验证EnumSet -----将全部的集合设置到EnumSet 集合中
代码:
package cn.com.zsc.day01;import java.util.EnumSet;public class EnumSetTest {    public static void main(String[] args) {        EnumSet<Col> es = null ;        es = EnumSet.allOf(Col.class);        print(es);    }    private static void print(EnumSet<Col> es) {        for(Col c:es){            System.out.print(c+"、");        }        System.out.println();    }}enum Col{    RED,BLUE,GREEN;}

运行结果:
RED、BLUE、GREEN、

5、让枚举类实现一个接口
枚举类也可以实现一个接口,但是因为接口会存在抽象方法,所以枚举类中的每个对象都必须实现接口中的抽象方法。
让枚举类实现一个接口:
代码:
package cn.com.zsc.day01;interface Print{    public String getColo();}enum Colo implements Print{    RED{        public String getColo(){            return "红色";        }    },    GREEN{        public String getColo(){            return "绿色";        }    },    BLUE{        public String getColo(){            return "蓝色";        }    };}public class InterfaceEnumTest {    public static void main(String[] args) {        for(Colo c:Colo.values()){            System.out.print(c.getColo()+"、");        }    }}

运行结果:
红色、绿色、蓝色、

以上程序在接口中定义了一个getColo()方法,枚举类在实现此接口之后,就必须对枚举类中的每个对象分别实现其接口中的getColo()方法。
6、在枚举类中定义抽象方法
枚举类除了可以实现接口外,还可以在枚举类中定义抽象方法,这样每个枚举类的对象只要实现了此抽象方法即可。
在枚举类中定义抽象方法:
代码:
package cn.com.zsc.day01;enum clo{    RED{        public String getColo(){            return "红色";        }    },    GREEN{        public String getColo(){            return "绿色";        }    },    BLUE{        public String getColo(){            return "蓝色";        }    };    public abstract String getColo();}public class AbstractMethodEnum {    public static void main(String[] args) {        for(Colo c:Colo.values()){            System.out.print(c.getColo()+"、");        }    }}

运行结果:
红色、绿色、蓝色、




原创粉丝点击