枚举的深入理解

[size=medium]ps:没有研究就没有发言权!

1.枚举类型是一种取值被严格限定在一个有限的集合中的变量类型。
2.java中的枚举是一种特殊的类。每一个枚举都会被编译成一个class文件。
3.枚举主要用于限定变量的取值,从而从根源上有效的避免了非法的赋值。
4.声明一个枚举:
public enum Sex{
MALE,FEMALE
}
可以声明在一个类的内部,也可以声明在一个单独的文件里。
若声明在一个类的内部,则会被编译为 :
类名$Sex.class。
证明这时enum是以内部类的形式存在。
相信很多人不明白MALE,FEMALE到底是什么类型。请看这句代码:
Sex sex = Sex.MALE;
只有相同类型才可以赋值。枚举是一种特殊的类,那么sex就是一个类的引用,那么MALE必定也是一个类的引用。以下代码进一步证明了这一点。
Sex.FEMALE.name();
因为只有类才可以调用方法。
所以在声明一个enum的时候只需要指定引用变量的名字,系统就会自动创建对象,并把地址返回给你定义的引用变量。
5.下面我们来模拟enum[/size]

package com.jnmc.Enum;
public class 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;
}
}

[size=medium][color=blue]
然后我们就可以使用它了,使用起来和Enum没有什么区别。
Weekday weekday = Weekday.SUN;
而且weekday 的值只能从集合{SUN,MON,TUE,WED,THU,FRI,SAT}中取,而不能被我们随便定义。
实际上,enum就是用类似的方法实现的。
6.使用有参构造方法创建enum
需注意:关于取值的定义必须放在enum体的开头
[/color][/size]

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");
}
}

[size=medium][color=blue]7.实现抽象方法
在enum体中声明了抽象方法,就将一个enum声明为一个抽象枚举了。这个enum就没法实例化,必须通过子类来实例化。[/color][/size]

public enum Weekday{
SUN(1){//用匿名内部类创建实例
@Override
public Weekday nextday() {
return MON;///这里更进一步说明了,MON是Weekday类型的引用
}
},///两个枚举的取值之间用','
MON{
@Override
public Weekday nextday() {
return TUE; }
},
TUE{
@Override
public Weekday nextday() {
return WED;
}
},
WED{
@Override
public Weekday nextday() {
return THUR;
}
},
THUR{
@Override
public Weekday nextday() {
return FRI;
}
},
FRI{
@Override
public Weekday nextday() {
return SAT;
}
},
SAT{
@Override
public Weekday nextday() {
return MON;
}
};///最后一个用‘;’
///定义了一个抽象方法,
//则在创建Weekday的时候就必须实现该抽象方法
public abstract Weekday nextday();
private Weekday(){}
private Weekday(int i){}
}

[size=medium]
但是我们并不建议这样使用enum,这样会增加系统消耗。因为这样会生成7个匿名内部类的class文件,形如:
Weekday$1.class
Weekday$2.class
在开发的时候,我们会更多地使用基本类型来代替enum。
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值