java enum 高级_JAVA高级(4)—— 枚举

1、问题

在枚举出现之前,如果想要表示一组特定的离散值,往往使用一些常量

public class Entity {

public static final int VIDEO = 1;//视频

public static final int AUDIO = 2;//音频

public static final int TEXT = 3;//文字

public static final int IMAGE = 4;//图片

private int id;

private int type;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public int getType() {

return type;

}

public void setType(int type) {

this.type = type;

}

}

缺点:

1)代码可读性差、易用性低;像是setType(2)这种用法也是在所难免,因为它完全合法,不是每个人都能够建立起用常量名代替数值,从而增加程序可读性、降低耦合性的意识。

2)类型不安全;setType(-1)这样的调用是合法的,但它并不合理,今后会为程序带来种种问题。

3)耦合性高,扩展性差;假如,因为某些原因,需要修改Entity类中常量的值,那么,所有用到这些常量的代码也就都需要修改——当然,要仔细地修改,万一漏了一个,那可不是开玩笑的。同时,这样做也不利于扩展。例如,假如针对类别做了一个有效性验证,如果类别增加了或者有所变动,则有效性验证也需要做对应的修改,不利于后期维护。

2、枚举

一种特殊的类,其中的每个元素都是该类的一个实例对象。

可以定义方法,并且实现接口。继承自java.lang.Enum类,因此enum不可以再继承其他的类。

枚举元素必须位于枚举体中最开始部分,以分号结尾。

通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量

用到枚举类型,全部对象都会被实例化,因为都是public static final修饰的

带有构造方法的枚举

public enum TypeEnum {

VIDEO(1, "视频"), AUDIO(2, "音频"), TEXT(3, "文本"), IMAGE(4, "图像");

int value;

String name;

TypeEnum(int value, String name) {

this.value = value;

this.name = name;

}

public int getValue() {

return value;

}

public String getName() {

return name;

}

}

带有抽象方法的枚举

public enum TrafficLamp {

RED(10) {

@Override

public TrafficLamp nextLamp() {

return GREEN;

}

},

GREEN(20) {

@Override

public TrafficLamp nextLamp() {

return null;

}

};

private int time;

public abstract TrafficLamp nextLamp();

TrafficLamp(int time) {

this.time = time;

}

}

3、方法

name() String //返回此枚举实例的常量名称。如:RED

ordinal() // 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

valueOf(String name) T //static方法,根据String转枚举实例

values() T[] //static方法,返回该枚举的所有值

4、EnumMap

专门为枚举类型量身定做的Map实现。虽然使用其它的Map实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高。

public enum Phase {

SOLID, LIQUID, GAS;

public enum Transition {

MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID), BOIL(LIQUID, GAS), CONDENSE(

GAS, LIQUID), SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);

private final Phase src;

private final Phase dst;

Transition(Phase src, Phase dst) {

this.src = src;

this.dst = dst;

}

private static final Map> m = new EnumMap>(

Phase.class);

static {

for (Phase p : Phase.values())

m.put(p, new EnumMap(Phase.class));

for (Transition trans : Transition.values())

m.get(trans.src).put(trans.dst, trans);

}

public static Transition from(Phase src, Phase dst) {

return m.get(src).get(dst);

}

}

public static void main(String[] args) {

for (Phase src : Phase.values())

for (Phase dst : Phase.values())

if (src != dst)

System.out.printf("%s to %s : %s %n", src, dst,

Transition.from(src, dst));

}

}

参考文献

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值