Java之enum

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

1.基本用法

Java 5 引入的关键字enum,用于定义枚举类型(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.

时间: 2024-11-08 17:30:52

Java之enum的相关文章

Java中Enum枚举的使用

注意项: 1.在switch中使用枚举能使代码的可读性更强. 2.如果要自定义方法,那么必须在enum实例序列的最后添加分号.而且Java要求必须先定义enum实例. 3.所有的枚举都继承自java.lang.Enum类,由于Java不支持多继承,所以枚举对象不能再继承其他类. 4.如果想让枚举对应值,那么要写构造方法,也可以再覆盖toString()方法

Java中enum的学习总结

一.通常的定义常量的方法 public class Sex{ public final static int MALE = 1; public final static int FEMALE=2; } 使用的时候,你能够在程序中直接引用这些常量.可是.这样的方式还是存在着一些问题. 类型不安全 因为颜色常量的相应值是整数形.所以程序运行过程中非常有可能给颜色变量传入一个随意的整数值.导致出现错误. 没有命名空间 因为颜色常量仅仅是类的属性,当你使用的时候不得不通过类来訪问. 一致性差 由于整形枚

Java——枚举enum

枚举我认为:枚举简单的说也可以一种数据类型,只不过是这种数据类型只包含我们自定义的数据,它是一组有共同特性的数据的集合.举个简单例子,颜色也可以定义成枚举类型,它可以包含你自定义的任何颜色,当需要的时候,只需要通过枚举调用即可,另外比如季节(春夏秋冬).星期(星期一到星期日).衣服的号码(S.M.L.XL)等等这些具有共同特性的数据都可以定义枚举.下面是个例子: public class EnumTest { public static void main(String[] args) { Sc

Java 枚举(enum) 详解7种常见的用法

用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. Java代码 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. Java代码 enum Signal { GREEN, YE

java之enum枚举(2015年05月28日)

背景: 今天启动了一个新的项目,由于要从之前的旧项目中拿过来一些代码,所以就看了下公司之前项目代码,发现有定义的常量类,也有枚举类,然后就在想着两者的功能差不多,那他们之间到底有什么区别呢,所以就决定了解下enum枚举   一.简介 Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型. 二.基本用法 1.作为常量使用 一个完整的枚举类型示例 /** * 枚举 * @author Dreyer * @since 1.0 * @dat

Java中Enum方法toString与ordinal方法

public enum Language { C, Java, PHP; } public class EnumDemo { public static void main(String args[]) { // returns the name of this enum constant(String) System.out.println("Programming in " + Language.C.toString()); System.out.println("Pro

Java枚举enum以及应用:枚举实现单例模式

枚举作为一个常规的语言概念,一直到Java5才诞生不得不说有点奇怪,以至于到现在为止很多程序员仍然更喜欢用static final的形式去命名常量而不使用,一般情况下,Java程序员用这种方式去实现枚举: class EnumByClass{ public static final int RED=0; public static final int GREEN=1; public static final int BLUE=2; } 这种方式实现的枚举也叫int枚举模式,尽管很常用,但是由in

java枚举enum

http://www.cnblogs.com/wenruo/p/5349614.html java的枚举通过关键字enum实现.可以理解为一个类,不过这个类由编译器自动加了一些方法. static values()方法用来按照enum常量的声明顺序 产生由这些常量值构成的数组 ordinal 表示某个特定enum常量的声明顺序 toString() 以显示每个enum实例的名字 可以在switch语句中使用,但是注意case处直接写常量,不加enum的名字. 1 enum Spiciness {

Java枚举enum使用及相关的操作

在Java1.5之后,引入了枚举新的特性,在之前,java有两种定义新类型的方式:类和接口.但是在特殊情况下,满足不了我们的需求,比如我们定义一个Color类,它只能有Red,Blue,Green三种值,对于其他的值来说都是无效的.为引入枚举之前,我们一般使用其私有化其构造方法,然后在其内部实例化三个常量,然后再取值.这样不仅繁琐,而且带来了更多不安全的问题. package andy.enumtype.test; /** * @author Zhang,Tianyou * version:20