枚举的最深刻剖析_枚举解析

2020-02-29 其他范文 下载本文

枚举的最深刻剖析由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“枚举解析”。

1.枚举类型是一种取值被严格限定在一个有限的集合中的变量类型。

2.java中的枚举是一种特殊的类。每一个枚举都会被编译成一个cla文件。

3.枚举主要用于限定变量的取值,从而从根源上有效的避免了非法的赋值。

4.声明一个枚举:

public enum Sex{

MALE,FEMALE

}

可以声明在一个类的内部,也可以声明在一个单独的文件里。

若声明在一个类的内部,则会被编译为 :

类名$Sex.cla。证明这时enum是以内部类的形式存在。

相信很多人不明白MALE,FEMALE到底是什么类型。请看这句代码: Sex sex = Sex.MALE;

只有相同类型才可以赋值。枚举是一种特殊的类,那么sex就是一个类的引用,那么MALE必定也是一个类的引用。

Sex.FEMALE.name();

只有类才可以调用方法。这句代码进一步证明了这一点。

所以在声明一个enum的时候只需要指定引用变量的名字,系统就会自动创建对象,并把地址返回给应用变量。

5.下面我们来模拟enum

package com.jnmc.Enum;

public cla Weekday {

//构造方法必须私有

//保证其他任何类都不能创建Weekday的实例

private Weekday(){} private String value = null;//在静态初始化的时候创建对象 //引用必须是共有的静态的 public static Weekday SUN = getInstance(“SUN”);public static Weekday MON = getInstance(“MON”);public static Weekday TUE = getInstance(“TUE”);public static Weekday WED = getInstance(“WED”);public static Weekday THU = getInstance(“THU”);

} public static Weekday FRI = getInstance(“FRI”);public static Weekday SAT = getInstance(“SAT”);private static Weekday getInstance(String day){Weekday d = new Weekday();d.value = day;return d;} @Override public String toString(){return value;}

然后我们就可以使用它了,使用起来和Enum没有什么区别。Weekday weekday = Weekday.SUN;

而且weekday 的取值只有通过Weekday的静态引用获得,而不能被我们随便定义。

实际上,enum就是用类似的方法实现的。

6.使用有参构造方法创建enum

需注意:关于取值的定义必须放在enum体的开头

public enum Color{

//创建Color实例时会默认调用无参的构造方法 //RED(3)调用了有参数的构造方法 //以下代码必须放在enum体的最开头

RED(3),YELLOW,BLUE;//若之后还有内容,应为‘;’

//注意构造方法只允许声明为私有的private Color(){

System.out.println(“constructor without

parameters”);

}

private Color(int i){

System.out.println(“constructor with one integer

parameter”);

}

}

7.抽象的enum

在enum体中声明了抽象方法,就将一个enum声明为一个抽象枚举了。这个enum就没法实例化,必须通过子类来实例化。

public enum Weekday{SUN(1){//用匿名内部类创建实例@Override public Weekday nextday(){

} return MON;///这里更进一步说明了,MON是Weekday类型的引用

},///两个枚举的取值之间用',' MON{@Overridepublic Weekday nextday(){return TUE;} }, TUE{@Overridepublic Weekday nextday(){return WED;} }, WED{@Overridepublic Weekday nextday(){return THUR;} }, THUR{@Overridepublic Weekday nextday(){return FRI;} },FRI{@Overridepublic Weekday nextday(){return SAT;} }, SAT{@Overridepublic Weekday nextday(){return MON;} };///最后一个用‘;’ ///定义了一个抽象方法,//则在创建Weekday的时候就必须实现该抽象方法public abstract Weekday nextday();private Weekday(){}private Weekday(int i){} }

但是我们并不建议这样使用enum,这样会增加系统消耗。因为这样会生成7个匿名内部类的cla文件,形如:

Weekday$1.cla

Weekday$2.cla

在开发的时候,我们会更多地使用基本类型来代替enum。

《枚举的最深刻剖析.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
枚举的最深刻剖析
点击下载文档
相关专题 枚举解析 最深刻 枚举解析 最深刻
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文