• emum类(2)


    emum定义如下:

    public abstract class Enum<E extends Enum<E>>extends Objectimplements Comparable<E>, Serializable

     此类定义使用了泛型接口,而且实现了Comparable接口和Serializable接口,证明了此类型是可以被比较和序列化的

    构造方法:

    protected  Enum(String name, int ordinal)      单独的构造方法。 

    emun构造方法,中接收的两个参数,一个表示枚举的名字(name()),另一个表示枚举的序号ordinal()

    public enum Color{
        RED,GREEN,BLUE ;
    }

    Red实际上就是枚举的名称,默认的编号是0.

    例子:

    package 类集;
    enum color1
    { red,black,green
        }
    public class test1{
        public static void main(String args[]){
            for(color1 c:color1.values()){
                System.out.println(c.ordinal() + " --> " + c.name()) ;
            }
        }
    }

    结果:

    0 --> red
    1 --> black
    2 --> green

    如果此时希望做点改进,希望使用文字表示 颜色的信息,则可以按照color类形式,在枚举类中定义属性(也就是name)构造方法

    但是一旦声明有参数构造之后,在声明枚举对象的时候就必须明确地调用构造方法,并传递参数

    如下:

    package 类集;
    enum Color{
        RED("红色"),GREEN("绿色"),BLUE("兰色") ;  //明确地调用构造方法,并且传递参数。
        private Color(String name){
            this.setName(name) ;
        }
        private String name ;            // 定义name属性
        public void setName(String name){
            this.name = name ;
        }
        public String getName(){
            return this.name ;
        }
    }
    public class test1{
        public static void main(String args[]){
            for(Color c:Color.values()){
                System.out.println(c.ordinal() + " --> " + c.name()
                    +"(" + c.getName() + ")") ;
            }
        }
    }

    返回结果:

    0 --> RED(红色)
    1 --> GREEN(绿色)
    2 --> BLUE(兰色)

    如果现在不想通过构造方法设置内容,而想通过getter(),setter()方法设置内容,则必须按照如下方式进行。

    package 类集;
    enum Color{
        RED,GREEN,BLUE ;
    private String name ;            // 定义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 ;
                }
            }
            this.name = name ;
        }
        public String getName(){
            return this.name ;
        }
    }
    public class test1{
        public static void main(String args[]){
            Color c = Color.BLUE ;    // 得到兰色
            c.setName("兰色") ;     // 名字错误
            c.setName("蓝色") ;     // 名字正确
            System.out.println(c.getName()) ;
        }
    }

    输出结果:

    设置内容错误。
    蓝色

    以上发现通过构造方法更简便一些。

    通过valueof()方法,指定枚举名称来得到枚举常量

    static <T extends Enum<T>>  T  valueOf(Class<T> enumType, String name)   返回带指定名称的指定枚举类型的枚举常量。 

    可以把上面那段代码主方法里的第一句话给替换掉。如下。

    package 类集;
    enum Color{
        RED,GREEN,BLUE ;
        private String name ;            // 定义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 ;
                }
            }
            this.name = name ;
        }
        public String getName(){
            return this.name ;
        }
    }
    public class test1{
        public static void main(String args[]){
            Color c = Color.valueOf(Color.class,"BLUE") ;    // 得到兰色
            c.setName("兰色") ;     // 名字错误
            c.setName("蓝色") ;     // 名字正确
            System.out.println(c.getName()) ;
        }
    }

    对于枚举.Class是java中反射机制内容。

    枚举中实际上已经实现了comparable接口,所以枚举中内容是可以排序的。

    package 类集;
    import java.util.Iterator;
    import java.util.Set;
    import java.util.TreeSet;
    
    enum Color{
        RED,GREEN,BLUE ;
    }
    public class test1{
        public static void main(String args[]){
            Set<Color> t = new TreeSet<Color>() ;    // 设置类型
            t.add(Color.GREEN) ;    // 加入绿色
            t.add(Color.RED) ;        // 加入红色
            t.add(Color.BLUE) ;        // 加入蓝色
            Iterator<Color> iter = t.iterator() ;
            while(iter.hasNext()){
                System.out.print(iter.next() + "、") ;
            }
        }
    }

    输出,

    RED、GREEN、BLUE、

    可以发现,加入TreeSet的时候是无序的,输出的时候是有序的。

    通过TreeSet

  • 相关阅读:
    队列<一>
    二叉树的遍历[先序,中序,后序]
    The method format(String, Object[]) in the type String is not applicable for the arguments
    sqlserver 备份 与 还原
    sqlserver 无法获得数据库独占权
    page.isvalid
    bzoj3994 [SDOI2015]约数个数和
    bzoj4868 [Shoi2017]期末考试
    bzoj1179 [Apio2009]Atm
    bzoj4869 [Shoi2017]相逢是问候
  • 原文地址:https://www.cnblogs.com/alsf/p/6260865.html
Copyright © 2020-2023  润新知