• JAVA基础知识|枚举


    将代码中经常使用的常量,放在枚举中,是一个很好的编码习惯。便于统一修改,同时也增强代码的严谨和稳定性。当然,枚举的应用有很多,这里我只做一个简单的演示,以后看到有趣的使用,会慢慢丰富

    package com.my.po;
    
    /**
     * description:{description}
     * author:jyy
     * date:2018-02-07 17:20
     * modify:{modify}
     */
    public enum Size {
    
        SMALL("S", "1"), MEDIUM("M", "2"), LARGE("L", "3"), EXTRA_LARGE("XL", "4");
    
        private String abbreviation;
        private String index;
    
        Size(String abbreviation, String index) {
            this.abbreviation = abbreviation;
            this.index = index;
        }
    
        public String getAbbreviation() {
            return abbreviation;
        }
    
        public String getIndex() {
            return index;
        }
    }

    分析:

    SMALL("S","1")执行构造函数Size(String abbreviation,String index)

    getAbbreviation()方法获取SMALL("S","1")中的S值

    getIndex()方法获取SMALL("S","1")中的1值

        @Test
        public void test() {
    
            //查询SMALL的值
            System.out.println(Size.SMALL.toString());
    
            //toString()方法的逆方法valueOf(),s=Size.SMALL
            Size s = Enum.valueOf(Size.class, "SMALL");
            System.out.println(s.toString());
    
            //获取SMALL中的abbreviation,index
            System.out.println(Size.SMALL.getAbbreviation());
            System.out.println(Size.SMALL.getIndex());
        }

    执行结果:

    SMALL
    SMALL
    S
    1

     这两天无意之间看到一个枚举类TimeUnit,里面的部分代码如下:

    public enum TimeUnit {
        /**
         * Time unit representing one thousandth of a microsecond
         */
        NANOSECONDS {
            public long toNanos(long d)   { return d; }
            public long toMicros(long d)  { return d/(C1/C0); }
            public long toMillis(long d)  { return d/(C2/C0); }
            public long toSeconds(long d) { return d/(C3/C0); }
            public long toMinutes(long d) { return d/(C4/C0); }
            public long toHours(long d)   { return d/(C5/C0); }
            public long toDays(long d)    { return d/(C6/C0); }
            public long convert(long d, TimeUnit u) { return u.toNanos(d); }
            int excessNanos(long d, long m) { return (int)(d - (m*C2)); }
        },
    
        。。。略。。。
    
        public long toNanos(long duration) {
            throw new AbstractMethodError();
        }
    
        /**
         * Equivalent to
         * {@link #convert(long, TimeUnit) MICROSECONDS.convert(duration, this)}.
         * @param duration the duration
         * @return the converted duration,
         * or {@code Long.MIN_VALUE} if conversion would negatively
         * overflow, or {@code Long.MAX_VALUE} if it would positively overflow.
         */
        public long toMicros(long duration) {
            throw new AbstractMethodError();
        }
    
        。。。略。。。
    }

    最初不是很理解,后来在网上看到一个对枚举原理解释的帖子,顿时豁然开朗,下面我将简单介绍一下。

    【举例】

    public enum Size {
    
        SMALL("S","1"){
            public String getSize(){
                return "小号";
            }
            public String getRange(){
                return "5-10";
            }
        },
        MEDIUM("M","2"){
            public String getSize(){
                return "中号";
            }
            public String getRange(){
                return "11-20";
            }
        },
        LARGE("L","3"){
            public String getSize(){
                return "大号";
            }
            public String getRange(){
                return "21-30";
            }
        };
    
        public abstract String getSize();
        public abstract String getRange();
    
        private String abbreviation;
        private String index;
    
        Size(String abbreviation, String index) {
            this.abbreviation = abbreviation;
            this.index = index;
        }
    
        public String getAbbreviation() {
            return this.abbreviation;
        }
    
        public String getIndex() {
            return this.index;
        }
    }
            System.out.println(Size.SMALL.getAbbreviation());
            System.out.println(Size.SMALL.getIndex());
            System.out.println(Size.SMALL.getSize());
            System.out.println(Size.SMALL.getRange());

    执行结果:

    S
    1
    小号
    5-10

    当声明枚举类型Size的时候,其实是声明一个抽象类Size,同时也声明了抽象方法getSize()、getRange()。SMALL、MEDIUM、LARGE都是Size的匿名内部类(由satic final 关键字修饰),并重写了抽象方法。

    可以将上面的枚举类Size,改写成以下方式:

    public abstract class Size {
    
        public static final Size SMALL = new Size("S", "1") {
            public String getSize() {
                return "小号";
            }
    
            public String getRange() {
                return "5-10";
            }
        };
        public static final Size MEDIUM = new Size("M", "2") {
            public String getSize() {
                return "中号";
            }
    
            public String getRange() {
                return "11-20";
            }
        };
        public static final Size LARGE = new Size("L", "3") {
            public String getSize() {
                return "大号";
            }
    
            public String getRange() {
                return "21-30";
            }
        };
    
        public abstract String getSize();
    
        public abstract String getRange();
    
        private String abbreviation;
        private String index;
    
        Size(String abbreviation, String index) {
            this.abbreviation = abbreviation;
            this.index = index;
        }
    
        public String getAbbreviation() {
            return this.abbreviation;
        }
    
        public String getIndex() {
            return this.index;
        }
    }
  • 相关阅读:
    [调参]batch_size的选择
    [调参]CV炼丹技巧/经验
    [Pytorch]Pytorch加载预训练模型(转)
    [PyTorch]论文pytorch复现中遇到的BUG
    [Opencv]图像的梯度与边缘检测(转)
    freemodbus移植、实例及其测试方法
    eclipse的C/C++开发搭建
    ROS安装
    U-boot移植
    QT开发实战一:图片显示
  • 原文地址:https://www.cnblogs.com/maikucha/p/8427394.html
Copyright © 2020-2023  润新知