枚举Enum
特点
- enum是一个特殊的class
- enum类的构造函数必须是私有的
- 枚举类可以继承抽象类,实现接口
- switch接受enum值
语法
1. 定义
enum 类名{
实例1,实例2,实例3.....;
方法、属性、构造函数
}
2. Simple
public class EnumDemo01 {
enum Fruit{
apple,banana,orange;
}
public static void main(String[] args) {
fun(Fruit.apple);
}
public static void fun(Fruit f){
System.out.println("fruit");
}
}
3. 构造函数
构造函数必须定义为私有的;
public class EnumDemo01 {
enum Fruit{
apple("1"),banana("2"),orange("3");
private String value;
//构造函数必须是私有的
private Fruit(String value){
this.value = value;
}
}
public static void main(String[] args) {
fun(Fruit.apple);
}
public static void fun(Fruit f){
System.out.println(f.value);
}
}
4. 抽象方法
public class EnumDemo01 {
enum Fruit{
apple("1"){
@Override
public String getValue() {
return "苹果";
}
},banana("2"){
@Override
public String getValue() {
return "香蕉";
}
},orange("3"){
@Override
public String getValue() {
return "橘子";
}
};
private String value;
private Fruit(String value){
this.value = value;
}
public abstract String getValue();
}
public static void main(String[] args) {
fun(Fruit.apple);
}
public static void fun(Fruit f){
System.out.println(f.getValue());
}
}
5. Enum类方法
常用方法:
- Fruit.apple.name(); 获取实例名称
- Fruit.apple.ordinal(); 获取此实例的序号;
- Fruit f = Fruit.valueOf("实例名称"); 根据实例名称返回实例;
- Fruit[] fs = Fruit.values(); 返回Fruit类全部的实例;
public class EnumDemo01 {
enum Fruit{
apple("1"){
@Override
public String getValue() {
return "苹果";
}
},banana("2"){
@Override
public String getValue() {
return "香蕉";
}
},orange("3"){
@Override
public String getValue() {
return "橘子";
}
};
private String value;
private Fruit(String value){
this.value = value;
}
public abstract String getValue();
}
public static void main(String[] args) {
fun(Fruit.apple);
}
public static void fun(Fruit f){
System.out.println(f.name()+"的次序:"+f.ordinal());
System.out.println(Fruit.valueOf("orange").getValue());
System.out.println(f.name());
Fruit[]fs = Fruit.values();
System.out.print("Fruit实例:");
for(Fruit e:fs){
System.out.print(e.getValue()+"、");
}
}
}
6. 完整演示代码
package com.melon.basic.enumeration;
import java.util.EnumMap;
import java.util.EnumSet;
/*
* 枚举类型的完整演示代码
*/
public class LightTest {
// 1.定义枚举类型
public enum Light {
// 利用构造函数传参
RED(1), GREEN(3), YELLOW(2);
// 定义私有变量
private int nCode;
// 构造函数,枚举类型只能为私有
private Light(int _nCode) {
this.nCode = _nCode;
}
@Override
public String toString() {
return String.valueOf(this.nCode);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// 1.遍历枚举类型
System.out.println("演示枚举类型的遍历 ......");
testTraversalEnum();
// 2.演示EnumMap对象的使用
System.out.println("演示EnmuMap对象的使用和遍历.....");
testEnumMap();
// 3.演示EnmuSet的使用
System.out.println("演示EnmuSet对象的使用和遍历.....");
testEnumSet();
}
/**
* 演示枚举类型的遍历
*/
private static void testTraversalEnum() {
Light[] allLight = Light.values();
for (Light aLight : allLight) {
System.out.println("当前灯name:" + aLight.name());
System.out.println("当前灯ordinal:" + aLight.ordinal());
System.out.println("当前灯:" + aLight);
}
}
/**
* 演示EnumMap的使用,EnumMap跟HashMap的使用差不多,只不过key要是枚举类型
*/
private static void testEnumMap() {
// 1.演示定义EnumMap对象,EnumMap对象的构造函数需要参数传入,默认是key的类的类型
EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(
Light.class);
currEnumMap.put(Light.RED, "红灯");
currEnumMap.put(Light.GREEN, "绿灯");
currEnumMap.put(Light.YELLOW, "黄灯");
// 2.遍历对象
for (Light aLight : Light.values()) {
System.out.println("[key=" + aLight.name() + ",value="
+ currEnumMap.get(aLight) + "]");
}
}
/**
* 演示EnumSet如何使用,EnumSet是一个抽象类,获取一个类型的枚举类型内容可以使用allOf方法
*/
private static void testEnumSet() {
EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class);
for (Light aLightSetElement : currEnumSet) {
System.out.println("当前EnumSet中数据为:" + aLightSetElement);
}
}
}
来源:oschina
链接:https://my.oschina.net/u/1474863/blog/794032