Java新特性(一)-- 枚举

枚举(enum)是JDK1.5提出的一个新特性。

Java中的枚举被定义为了一个类,将枚举引入类以后,枚举的功能被大大扩展,里面可以有构造函数、方法和实例变量,甚至可以实现接口,每一个枚举常量都是它的枚举类型的一个对象。

1. 引出问题

我们先来回顾一下多例设计模式:

package www.testdemo;

class Color {
    private String title;

    private static final Color RED = new Color("RED");
    private static final Color GREEN = new Color("GREEN");
    private static final Color BLUE = new Color("BLUE");

    private Color(String title) {
        this.title = title;
    }

    public static Color getInstance(int ch) {
        switch (ch) {
            case 1:
                return RED;
            case 2:
                return GREEN;
            case 3:
                return BLUE;
            default:
                return null;
        }
    }

    @Override
    public String toString() {
        return "Color{" +
                "title='" + title + '\'' +
                '}';
    }
}

public class MeiJu {
    public static void main(String[] args) {
        System.out.println(Color.getInstance(2));
    }
}

以上做法是在JDK1.5以前的做法,这样做的目的是限制本类实例化对象的产生个数。但是从JDK1.5开始有了枚举,上述代码可以使用枚举来取代。

2. Enum类

虽然JDK1.5提供了enum关键字,但是enum并不是一种新的结构,相反,它只是对一种类型的包装:使用enum关键字定义的枚举类本质上就相当于一个Class定义的类,继承了java.lang.Enum父类,单继承关系,不能再继承其他类。

  • Enum类里面有以下方法:
  • 使用枚举对象:枚举类.属性
  • 构造方法:protected Enum(String name, int ordinal);
  • 取得枚举对象的名称:public final String name();
  • 取得枚举序号:public final int ordinal();
package www.testdemo;

enum Color {
    RED, BLUE, GERRN
}

public class MeiJu {
    public static void main(String[] args) {
        System.out.println(Color.BLUE.ordinal() + "=" +Color.BLUE.name());
    }
}

在这里插入图片描述

  • 接着试着把三种颜色的顺序调整一下,看看结果会不会发生变化?
package www.testdemo;

enum Color {
    RED, GERRN, BLUE
}

public class MeiJu {
    public static void main(String[] args) {
        System.out.println(Color.BLUE.ordinal() + "=" +Color.BLUE.name());
    }
}

在这里插入图片描述
通过以上代码我们会发现,所有的枚举类默认继承于Enum类。而且枚举对象的ordinal()方法在开发中要避免使用,它的值基于枚举对象定义的顺序!!!

  • 列举所有的枚举对象:枚举类.values(),例如Color.values();
package www.testdemo;

enum Color {
    RED, GERRN, BLUE
}

public class MeiJu {
    public static void main(String[] args) {
        for (Color temp : Color.values()) {
            System.out.println(temp.ordinal()+" = " +temp.name());
        }
    }
}

在这里插入图片描述

面试题:请解释enum与Enum区别。
enum是一个关键字,使用enum定义的枚举类本质上就相对于一个类继承了Enum这个抽象类而已。

3. 定义结构

枚举类型是一个典型的多例设计,每个枚举对象都是有且只有一个。但是多例设计是在一个类中产生的,所以该类中可以定义更多的属性或方法。所以在枚举设计的时候考虑到这些因素,提出了更为全面的设计方案:可以在枚举中定义属性、方法、实现接口

package www.testdemo;

interface IColor {
    //返回颜色的RGB字符串表示的值
    String getColorRGB();
}

//枚举实现接口
enum Color implements IColor {
    RED("#0000ff"),
    GREEN("#00ff00"),
    BLUE("#00ff11"),
    YELLOW("#ff000");

    private String rgb;

    Color(String rgb) {
        this.rgb = rgb;
    }

    public String getRgb() {
        return rgb;
    }

    public void print() {
        System.out.println(this + " 颜色的RGB " + this.getRgb());
    }
    
    @Override
    public String getColorRGB() {
        return this.rgb;
    }
}

public class MeiJu {
    public static void main(String[] args) {
        //直接通过 枚举.属性 调用
        IColor color = Color.RED;
        System.out.println(color.getColorRGB());
    }
}

在这里插入图片描述

4. 枚举应用

枚举的最大特点是只有指定的几个对象可以使用。

这样我们就可以把性别分装成一个枚举类,它能产生对象的个数是一定的,假设能产生三个对象,分别是男、女和未知。

package www.testdemo;

class Person {

    private String name;
    private Integer age;
    private Gender gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
}

enum Gender {

    //实际开发中需要根据业务情况决定此处枚举对象的数量
    MALE("男"),
    FEMALE("女");

    private String flag;

    //构造方法
    Gender(String flag) {
        this.flag = flag;
    }

    public String getFlag() {
        return flag;
    }
}

public class MeiJu {
    public static void main(String[] args) {

        Person person = new Person();

        person.setName("Jack");
        person.setAge(21);
        person.setGender(Gender.MALE);

        System.out.println(person);
    }
}

在这里插入图片描述

  • switch除了可以支持数字、字符和字符串以外,还可以支持枚举类型
switch (person.getGender()) {
	case MALE:
		System.out.println("男同志");
		break;
	case FEMALE:
		System.out.println("女同胞");
		break;
	default:
		System.out.println("未知");
}

猜你喜欢

转载自blog.csdn.net/qq_43508801/article/details/88977716
今日推荐