[Java5新特性]枚举

什么是枚举类型

如果定义一个类来完成企业员工信息,员工信息包括姓名、年龄及职位等信息(职位只有WORKER、MANAGER及BOSS三个角色),具体完成代码如下:

public class Demo {
    private String name;
    private Integer age;
    private String role;
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }

    public static void main(String[] args) {
        Demo emp1 = new Demo();
        emp1.setRole("WORKER");
        Demo emp2 = new Demo();
        emp2.setRole("MANAGER");
        Demo emp3 = new Demo();
        emp3.setRole("老大");

        List<Demo1> list = new ArrayList<Demo1>();
        list.add(emp1);
        list.add(emp2);
        list.add(emp3);

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getRole());
        }
    }
}

在上述代码中,我们可以看到在为员工设置职位角色时,可以设置不在要求中的其他角色。这样使得我们的代码安全很低(会出现意外值),还有就是代码的可读性并不是很好。我们可以将上述代码进行如下改写:

public class Demo {
    private String role;

    public static void main(String[] args) {
        Demo emp1 = new Demo();
        emp1.role = Role.WORKER;
        Demo emp2 = new Demo();
        emp2.role = Role.MANAGER;
        Demo emp3 = new Demo();
        emp3.role = "老大";

        List<Demo2> list = new ArrayList<Demo2>();
        list.add(emp1);
        list.add(emp2);
        list.add(emp3);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).role);
        }
    }
}

class Role {
    public static final String BOSS = "BOSS";
    public static final String MANAGER = "MANAGER";
    public static final String WORKER = "WORKER";
}

通过这样的改写之后,代码的可读性有所提高。但是,在职位角色上依旧可以出现意外的其他值,这样的结果是我们所不希望看到的。所以,我们需要继续改写上述代码:

public class Demo {
    private Role role;

    public static void main(String[] args) {
        Demo emp1 = new Demo();
        emp1.role = Role.BOSS;
        Demo emp2 = new Demo();
        emp2.role = Role.MANAGER;
        Demo emp3 = new Demo();
        emp3.role = "老大"; // 这里这时会报错

        List<Demo3> list = new ArrayList<Demo3>();
        list.add(emp1);
        list.add(emp2);
        list.add(emp3);

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).role);
        }
    }
}

class Role {
    public static final Role BOSS = new Role();
    public static final Role MANAGER = new Role();
    public static final Role WORKER = new Role();

    private Role() { }
}

当上述代码改写到此时,代码安全性和可读性的问题都已解决。但是,Java 5版本提供了一种更简单的方式来解决这个问题:

public class Demo {
    private Role role;

    public static void main(String[] args) {
        Demo emp = new Demo();
        emp.role = Role.BOSS;
    }
}

enum Role {
    WORKER, MANAGER, BOSS;
}

这里的“enum”关键字表示枚举类型,意思就是说在职位中具有WORKER、MANAGER及BOSS三种职位,并且只能在这三种中选择。而枚举类型中的WORKER、MANAGER及BOSS三个成员实际上都是一个Role对象。

枚举与switch

通过上面的讨论,我们可以看到枚举很适合在switch语句中使用,下面我们来看个案例代码:

public class Demo {
    private Role role;

    public static void main(String[] args) {
        Demo emp = new Demo();
        emp.role = Role.BOSS;
        switch (emp.role) {
        case WORKER:
            System.out.println("这是员工角色.");
            break;
        case MANAGER:
            System.out.println("这是经理角色.");
            break;
        case BOSS:
            System.out.println("这是老板角色.");
            break;
    }
}

enum Role {
    WORKER, MANAGER, BOSS;
}

注意的是,在switch语句中,不能使用枚举类名称,例如“case Role.WORKER”。因为编译器会根据switch语句中的emp.role来判断每个枚举类型。

枚举类型的构造器

在枚举类中具有默认的构造器,也可以自定义构造器。但是,在自定义构造器时,还是需要注意一些问题的。

使用默认构造器的代码如下:

public enum Role {
    WORKER, MANAGER, BOSS;

    private Role() { }
}

需要注意的是:

  • 如果要定义构造器的话,在最后一个枚举项添加分隔符“;”。
  • 构造器只能使用private修饰符。

使用自定义构造器的代码如下:

public enum Role {
    WORKER("WORKER"), MANAGER("MANAGER"), BOSS("BOSS");

    private Role(String role) {
        System.out.println(role);
    }
}

如果自定义构造器接收参数的话,在枚举项中需要传递对应的信息。具体做法就是在枚举项后添加“()”,直接传递即可。

枚举类型的成员

在枚举类中不仅可以包含构造器,还可以包含成员变量和成员方法。例如以下代码:

public enum Role {
    WORKER, MANAGER, BOSS;

    private String role;

    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
}

但是需要注意的是无论是构造器还是成员,枚举类中首先一定要定义的是枚举项,其他内容必须在枚举项后面。

枚举类中还可以包含抽象方法:

public enum Role {
    WORKER {
        @Override
        public void show() {
            System.out.println("WORKER");

        }
    },
    MANAGER {
        @Override
        public void show() {
            System.out.println("MANAGER");

        }
    },
    BOSS {
        @Override
        public void show() {
            System.out.println("MANAGER");

        }
    };

    public abstract void show();

}

当然,如果枚举类包含抽象方法的话,枚举项必须实现该抽象方法。

枚举类型常用API

实际上,我们所使用的枚举类都是java.lang.Enum类的子类,并继承了Enum类的所有方法。常用方法如下:

  • name():获取枚举项的名称。
  • ordinal():获取枚举项的索引值,索引值从“0”开始。
  • valueof(Class enumClass, String name):获取对应枚举类对象。

自定义的枚举类的常用方法如下:

  • valueof(String name):获取对应枚举类对象。
  • values():此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。


转载说明:请注明作者及原文链接,谢谢!

时间: 2024-10-25 18:11:24

[Java5新特性]枚举的相关文章

Java5新特性之枚举

1.  概念 首先,枚举并不是一种新技术,而是一种基础数据类型.它隶属于两种基础类型中的值类型,如下: 2.  为什么要有枚举 枚举在真正的开发中是非常常用的,它的作用很简单也很纯粹:它定义了一种规范,就是要让某个类型的变量的取值只能为若干个固定值中的一个,也就是要符合它定义的规范.它可以让编译器在编译时就可以识别程序中填写的非法值,一定程度上防止了运行时的非法类型值错误. 例如:要定义星期几的变量,如果用普通变量1-7   分别表示星期一到星期日,但有人可能写成int weekday=0.这种

Java5新特性

"JDK1.5/Java5"的一个重要主题就是通过新增一些特性来简化开发. 这些特性包括泛型,for-each循环,自动装包/拆包,枚举,可变参数, 静态导入,注解. 使用这些特性有助于我们编写更加清晰,精悍,安全的代码. 1.泛型(Generic)C++通过模板技术可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能.一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换.猛虎引入了泛型,它允许指定集合里元素的类型,这样你可以得到

Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱

JDK1.5已经发布很长时间,之所以还拿出来是因为它增加了很多个重要的特性,使用这些特性有助于我们简化开发,编写的代码更加简洁清晰安全,主要有以下几个特性: ?  静态导入 ?  可变参数 ?  增强for循环 ?  自动拆装箱 ? 泛型 ? 枚举 由于泛型.枚举内容比较多,也最重要,之后单拿出来讲.这里先介绍前面四个简单而又实用的小特性. 1. 静态导入 所谓"静态导入"只不过是在普通的import语句中加入关键字static,例如: ?  非静态导入:import java.lan

java5 新特性

1.静态导入方法 Java代码   package com.java.new_features_jdk5; /** * * 一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....ClassName.*; * 这里的多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法.当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了. * 然后在这个类中,就可以直接用方

[Java5新特性]Annotation注解

Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annotation就是提供了一种为程序元素设置元数据的方法,可用于修饰包.类.构造器.方法.成员变量.参数和局部变量的声明,这些信息被存储在Annotation的"name=value"对中. Annotation能被用来为程序元素(类.方法.成员变量等)设置元数据,比如一段代码的作者或者告诉编译器禁止一些特殊的错误,不会影响代码的执行. 基本A

[Java5新特性]自动装箱/拆箱

自动装箱/拆箱概述 Java中具有基本类型(int,double,float,long,boolean,char,byte,short)和基本类型包装类(Integer,Double,Float,Long,Boolean,Char,Byte,Short),我们实现基本类型与包装类之间的转换基本有两种方式: 一种为JDK5之前的方式,比如Integer i = Integer.valueof(5);(这里5为基本类型int,Integer包装类利用valueof()方法将其转换为Integer类型

[Java5新特性]可变参数

什么是可变参数 Java基础内容中,关于函数具有一种特性:重载,如果我们要完成多个数字想加的需求,可以按照以下代码完成: public class Demo { public int add(int a, int b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } public static void main(String[] args) { int sum1 = new Demo().a

[Java5新特性]类加载器

类加载器概述 类加载器负责加载所有的类,系统为所有被载入内存中的类生成一个java.lang.Class实例.一旦一个类被加入JVM中,同一个类就不会被再次加入了.正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识.在Java中,一个类用其全限定类名(包括包名和类名)作为标识:但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识. 例如以下案例,在JVM中两个同名的Person类是完全不同的,之间也互不兼容,因为类加载器不同. 上述情况转换成代码如下: 定义一个Per

JDK5.0新特性-枚举

枚举 枚举是什么? 它就是一个特殊的java类. 类的定义 class 类名{} 接口的定义 interface 接口名{} 枚举的定义 enum 枚举名{} 示例 public enum Demo1{} 也会生成一个class文件. 我们对其进行反编译. 定义到我们的class文件所在目录下 执行 javap Demo1 得到的结果 public final class Demo1 extends java.lang.Enum<cn.itcast.enumdemo.Demo1> { stat