Java SE 枚举类型详解

枚举的使用


一、枚举的历史

枚举是jdk1.5版本推出的,主要作用是确定某一个范围里的值

早先时候,程序员使用枚举需要通过定义类的方式来使用

public class Color{
	private String name;
	public static final Color RED = new Color("红色");
	public static final Color GREEN = new Color("绿色");
	public static final Color BLUE = new Color("蓝色");

	public String getName(){
		return name;
	}

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

	//私有构造函数
	private Color(String name){
		this.setName(name);
	}

	public static Color getInstance(int i){
		if(i == 0) return RED;
		if(i == 1) return GREEN;
		if(i == 2) return BLUE;
		return null;
	}
}

调用时则应该先获取实例,再调用实例的getName方法

可以看到这种方法非常不方便


二、正式使用枚举

枚举的定义方法

public enum Color{RED,BLUE,PURPLE;}

枚举的使用方法

//枚举的简单使用
public class Main {
    public static void main(String[] args) {
        Color c = Color.RED;
        System.out.println(c);
    }
}//output:RED

枚举类和枚举关键字

枚举类指Enum,是规定枚举类型的母类。而枚举关键字则是定义了一个枚举,使用枚举关键字创建枚举时自动继承Enum。
设置枚举对象会调用枚举类的受保护的构造方法

枚举类包含更多常用的方法,方便代码编写

枚举类集的使用
EnumMap继承了Map接口,使用起来与Map没有区别,唯一的区别是构造函数中需要传入一个Enum类

public class Main {
    public static void main(String[] args) {
        EnumMap<Color, String> eMap = new EnumMap<Color, String>(Color.class);
        eMap.put(Color.RED, "red");
        eMap.put(Color.PURPLE, "purple");
        eMap.put(Color.BLUE, "blue");
        for (Map.Entry<Color, String> me : eMap.entrySet())
            System.out.println(me.getKey() + "--->" + me.getValue());
    }
}
//output:RED--->red BLUE--->blue PURPLE--->purple

EnumSet是一个抽象类,是Set接口的子类,没有明显的构造方法,此类的方法都是静态操作
allOf方法将枚举所有的内容设置到集合
noneOf方法返回一个空集合

public static void main(String[] args) {
        EnumSet<Color> eSet = EnumSet.allOf(Color.class);
        Iterator<Color> iterator = eSet.iterator();
        while (iterator.hasNext())
            System.out.println(iterator.next());
    }

枚举的构造函数方法
枚举可以直接定义构造方法,但需要注意的是,一旦定义,所有的枚举对象都必须明确的调用此方法。
枚举的构造方法不能是public,因为不允许外部调用。每一个枚举对象都有自己的name属性。

public enum Color {
    //这里明确地调用了构造方法
    RED("红色"),BLUE("蓝色"),PURPLE("紫色");
    private String name;

    public String getName() {
        return name;
    }

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

    Color (String name){
        this.setName(name);
    }
}

枚举接口
枚举接口可以定义一个抽象方法,枚举类可以实现该接口,如果没有定义枚举构造方法。则枚举类的每一个对象都需要实现枚举接口中定义的方法

public interface Info {
    String getColor();
}
public enum Color implements Info {

    RED{
        @Override
        public String getColor() {
            return "红色";
        }
    },

    GREEN {
        @Override
        public String getColor() {
            return "绿色";
        }
    },

    PURPLE {
        @Override
        public String getColor() {
            return "紫色";
        }
    }

}

在枚举中定义抽象方法
和接口类似,可以在枚举中定义多个抽象方法。如果枚举中没有构造方法,则枚举中每个对象都需要实现该抽象方法.

public enum Color{

    RED{
        @Override
        public String getColor() {
            return "红色";
        }
    },

    GREEN {
        @Override
        public String getColor() {
            return "绿色";
        }
    },

    PURPLE {
        @Override
        public String getColor() {
            return "紫色";
        }
    };

    public abstract String getColor();

}
posted @ 2022-03-19 10:02  清巡  阅读(57)  评论(0编辑  收藏  举报