标签:pop 继承 理解 lease pac line 数值 表示 .text
枚举(enum),是指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值。枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量。Java从JDK5开始,引入了对枚举的支持。
在枚举出现之前,如果想要表示一组特定的离散值,往往使用一些常量。例如:
- package com.fhp.enumexample;
-
- 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;
- }
-
-
- }
当然,常量也不仅仅局限于int型,诸如char和String等也是不在少数。然而,无论使用什么样的类型,这样做都有很多的坏处。这些常量通常都是连续、有无穷多个值的量,而类似这种表示类别的量则是离散的,并且通常情况下只有有限个值。用连续的量去表示离散量,会产生很多问题。例如,针对上述的Entity类,如果要对Entity对象的type属性进行赋值,一般会采用如下方法:
- Entity e = new Entity();
- e.setId(10);
- e.setType(2);
这样做的缺点有:(1)代码可读性差、易用性低。由于setType()方法的参数是int型的,在阅读代码的时候往往会让读者感到一头雾水,根本不明白这个2到底是什么意思,代表的是什么类型。当然,要保证可读性,还有这样一个办法:
e.setType(Entity.AUDIO);
(2)类型不安全。在用户去调用的时候,必须保证类型完全一致,同时取值范围也要正确。像是setType(-1)这样的调用是合法的,但它并不合理,今后会为程序带来种种问题。也许你会说,加一个有效性验证嘛,但是,这样做的话,又会引出下面的第(3)个问题。
(3)耦合性高,扩展性差。假如,因为某些原因,需要修改Entity类中常量的值,那么,所有用到这些常量的代码也就都需要修改——当然,要仔细地修改,万一漏了一个,那可不是开玩笑的。同时,这样做也不利于扩展。例如,假如针对类别做了一个有效性验证,如果类别增加了或者有所变动,则有效性验证也需要做对应的修改,不利于后期维护。
枚举就是为了这样的问题而诞生的。它们给出了将一个任意项同另一个项相比较的能力,并且可以在一个已定义项列表中进行迭代。枚举(在Jave中简称为enum)是一个特定类型的类。所有枚举都是Java中的新类java.lang.Enum的隐式子类。此类不能手工进行子类定义。一个简单的枚举可以是这样:
- package com.fhp.enumexample;
-
- public enum TypeEnum {
- VIDEO, AUDIO, TEXT, IMAGE
- }
上面的Entity类就可以改成这样:
- package com.fhp.enumexample;
-
- public class Entity {
-
- private int id;
- private TypeEnum type;
-
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
-
- public TypeEnum getType() {
- return type;
- }
- public void setType(TypeEnum type) {
- this.type = type;
- }
- }
- Entity e = new Entity();
- e.setId(10);
- e.setType(TypeEnum.AUDIO);
因为在Java中一个枚举就是一个类,它也可以有属性和方法,并且实现接口。只是所有的枚举都继承自java.lang.Enum类,因此enum不可以再继承其他的类。
下面给出在枚举中声明属性和方法的示例:
- package com.fhp.enumexample;
-
- public enum TypeEnum {
- VIDEO(1), AUDIO(2), TEXT(3), IMAGE(4);
-
- int value;
-
- TypeEnum(int value) {
- this.value = value;
- }
-
- public int getValue() {
- return value;
- }
- }
- TypeEnum type = TypeEnum.TEXT;//type的value属性值为3。
- System.out.println(type.getValue());//屏幕输出3。
如果要为每个枚举值指定属性,则在枚举中必须声明一个参数为属性对应类型的构造方法(不能是public)。否则编译器将给出The constructor TypeEnum(int, String) is undefined的错误。在此例中,属性为int型,因此构造方法应当为int型。除此之外,还可以为枚举指定多个属性,如:
- package com.fhp.enumexample;
-
- 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;
- }
- }
int compareTo(E o)
比较此枚举与指定对象的顺序。
Class<E> getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString()
返回枚举常量的名称,它包含在声明中。
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
static T[] values()
返回该枚举的所有值。
现在,假设要为该枚举实现一个根据整数值生成枚举值的方法,可以这样做:
- package com.fhp.enumexample;
-
- 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 static TypeEnum getByValue(int value) {
- for(TypeEnum typeEnum : TypeEnum.values()) {
- if(typeEnum.value == value) {
- return typeEnum;
- }
- }
- throw new IllegalArgumentException("No element matches " + value);
- }
- }
综上,我们可以看到,在JDK5中新引入的枚举完美地解决了之前通过常量来表示离散量所带来的问题,大大加强了程序的可读性、易用性和可维护性,并且在此基础之上又进行了扩展,使之可以像类一样去使用,更是为Java对离散量的表示上升了一个台阶。因此,如果在Java中需要表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量,应当尽量舍弃常量表示的做法,而将枚举作为首要的选择。
标签:pop 继承 理解 lease pac line 数值 表示 .text
原文地址:https://www.cnblogs.com/zhuhui-site/p/10090830.html