• Java之enum


    扩展《编程导论(Java)·3.2.6》的内容。全面介绍enum

    1.基本使用方法

    Java 5 引入的keywordenum,用于定义枚举类型(enumerated type)。

    public enum Direction{
        UP,DOWN,LEFT,RIGHT
    }
    ☆有效地降低代码中public static final命名常量的声明。

    ☆编译后生成Direction.class文件。

    ☆Direction是java.lang.Enum的子类。不可以再继承其它父类。

    ☆枚举值都是public、static、final。假设声明枚举常量后没有其它代码。能够省略最后的分号。(不推荐)

    ☆枚举值UP等属于Direction类型。下面均打印true

            pln(UP instanceof Direction) ;
            pln(UP instanceof Enum) ;
            pln(UP instanceof Comparable) ;

    ☆枚举值UP等的核心使用方法,源于它的名-值UP.name()为String常量"UP"。UP.ordinal()为int值,默觉得基于0的排列序号。


    ☆枚举值的源于Comparable的public int compareTo(E e)。计算枚举值ordinal()之差。pln(UP.compareTo(LEFT)) ; //-2

    ☆枚举可用于switch(能够安全使用==比較)

    ☆枚举可用于for-each语句。

            for( Direction d : Direction.values()) {
                pln(d)  ;    
            }

    ☆枚举除了名-值数据如"UP"、0之外,能够定义自己的其它成员变量


    public enum Direction{
        UP(5),DOWN,LEFT,RIGHT;
        static{
            RIGHT.value=10;
        }
        private int value;
        private Direction(int value){
            this.value = value;
        }
        private Direction(){
            this(0);
        }
        static void test(){
            for( Direction cl : Direction.values()) {
                pln(cl)  ;    
            }
            pln(UP instanceof Direction) ;
            pln(UP.name() +":"+ UP.ordinal()+" value"+UP.value) ;
            pln(UP.compareTo(LEFT)) ;
        }
    }
    为了声明私有实例域value保存枚举常量的须要的数据。要声明私有(最多包级私有,可是没有效果)的构造器。

    UP(5)是替代静态初始化块的语法糖,所有依照RIGHT那样写。比較直观但不够UP(5)简洁。因为DOWN没有使用Direction(int)构造器,因而Direction()这里是须要的。

    2.Value-Specific Class Bodies 枚举值特定的匿名类

    public enum Direction{    
        UP{
            @Override void foo(){pln(UP) ;}
        },DOWN,LEFT,RIGHT;
        void foo(){}
        static void test(){
            UP.foo();
        }
    }
    Direction中定义了方法实例方法foo(),UP后面的{}产生一个继承于Direction的匿名类,字节码文件如Direction$1.class。

    不可以使用new创建枚举类型的对象,由于枚举类型的构造器都视为私有。外界使用方式:Direction.UP.foo();

    public class Test{
        static void test(){
            Direction.UP.foo();
            Direction d = Direction.DOWN;
            d.foo();//do nothing
        }
    }

    枚举类型的使用。參考Effective Java》等 、状态模式-2.

  • 相关阅读:
    MongoDB存储
    python 查看文件名和文件路径
    Python遍历文件个文件夹
    Python图片缩放
    python opencv
    Python3 关于UnicodeDecodeError/UnicodeEncodeError: ‘gbk’ codec can’t decode/encode bytes类似的文本编码问题
    jmter使用
    HttpRunnerManager使用
    PostMan使用
    工作中的思想
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7211447.html
Copyright © 2020-2023  润新知