您的位置:首页 > 编程语言 > Java开发

Java基础系列:(2)关于枚举的简单总结

2016-02-02 10:04 639 查看
一 枚举类型简介 在JDK1.5之前,Java是没有枚举类型的,只有:类和接口。当然,在一般情况下这两种类型就已经足够了,不过在某些特殊情况下就显得有点不合适了。比如:“春夏秋冬”组成的四季这个“数据集”就不能有其他元素;定义一个Color类,它只能有Red,Green,Blue这3个值。像这样只有几个固定的元素组成的“数据集”,其他的任何值都是非法的,这时我们就可以使用枚举类型。 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。如果想要在JDK1.5之前实现类似枚举的功能,就必须依靠类似以下这种代码来完成。
package javase.enumdemo;

public class Color {
/**
* 定义三个实例化对象,同时构造方法私有化,外部想要取得Color类的实例
* 就只能通过RED,GREEN和BLUE这三个对象
* */
public static final Color RED = new Color("红色");
public static final Color GREEN = new Color("绿色");
public static final Color BLUE = new Color("蓝色");
private String name;
/**
* 构造方法私有化
* */
private Color(String name) {
this.name = name;
}

public String getName() {
return name;
}

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

public static void main(String[] args) {
Color color_1 = Color.RED;
System.out.println(color_1.getName());

}

}
输出:
红色

以上的代码还是有不少问题的,最明显的一点是:如果用户想要知道到底有多少种颜色可以使用,其实现的代码就不是那么简单,更别说加入到集合进行操作了。因此,枚举就是为了解决这些问题而产生的。二 枚举类型的定义和常用方法(1)定义:[public] enum 枚举类型名称{ 枚举对象1,枚举对象2,…,枚举对象n;}实例:
package javase.enumdemo;

public enum Color_2 {
/**
* 定义了3个枚举类型
* */
RED,GREEN,BLUE;
}
(2)常用方法示例:
package javase.enumdemo;

public class Color_2Demo {
/**
* 取出枚举内容
* */
public void getEnumContent() {
Color_2 color = Color_2.RED;
System.out.println(color);
}

/**
* 遍历所有枚举内容
* */
public void forEachEnum() {
for (Color_2 color : Color_2.values())
System.out.println(color);
}

/**
* switch判断
* */
public void switchPrintEnum() {
for (Color_2 color : Color_2.values()) {
switch (color) {
case RED:
System.out.println("红色");
break;

case GREEN:
System.out.println("绿色");
break;

case BLUE:
System.out.println("蓝色");
break;

default:
System.out.println("未知颜色");
break;
}
}
}

/**
* 测试枚举的ordinal()和name()方法
* */
public void ordinalTest(){
for(Color_2 color : Color_2.values()){
//color.ordinal()  返回枚举常量的序数
//color.name()     返回枚举常量的名称
System.out.println(color.ordinal() + " --> " + color.name());
}
}

public static void main(String[] args) {
Color_2Demo color_2Demo = new Color_2Demo();
color_2Demo.getEnumContent();
System.out.println("******************http://www.zifangsky.cn**********************");

color_2Demo.forEachEnum();
System.out.println("******************http://www.zifangsky.cn**********************");

color_2Demo.switchPrintEnum();
System.out.println("******************http://www.zifangsky.cn**********************");

color_2Demo.ordinalTest();

}

}
输出:
RED
******************http://www.zifangsky.cn**********************
RED
GREEN
BLUE
******************http://www.zifangsky.cn**********************
红色
绿色
蓝色
******************http://www.zifangsky.cn**********************
0 --> RED
1 --> GREEN
2 --> BLUE

三 为每一个枚举对象属性赋值(1)通过构造方法为属性赋值
package javase.enumdemo;

public enum Color_3 {
RED("红色"),GREEN("绿色"),BLUE("蓝色");
private String name;

/**
* 为枚举对象属性赋值
* 第一种方式,通过构造方法
* */
private Color_3(String name) {
this.name = name;
}

public String getName() {
return name;
}

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

}
测试:
package javase.enumdemo;

public class Color_3Demo {

public static void main(String[] args) {
for (Color_3 color : Color_3.values())
System.out.println(color.ordinal() + " --> " + color.name() + "("
+ color.getName() + ")");
}

}
输出:
0 --> RED(红色)
1 --> GREEN(绿色)
2 --> BLUE(蓝色)
(2)通过setter方法为属性赋值
package javase.enumdemo;

public enum Color_4 {
RED,GREEN,BLUE;
private String name;

public String getName() {
return name;
}
/**
* 为枚举对象属性赋值
* 第二种方式,通过setter方法
* */
public void setName(String name) {
switch (this) {
case RED:
if("红色".equals(name))
this.name = name;
else
System.out.println("设置属性名称不恰当");
break;

case GREEN:
if("绿色".equals(name))
this.name = name;
else
System.out.println("设置属性名称不恰当");
break;

case BLUE:
if("蓝色".equals(name))
this.name = name;
else
System.out.println("设置属性名称不恰当");
break;

default:
break;
}
}

}
测试:
package javase.enumdemo;

public class Color_4Demo {

public static void main(String[] args) {
Color_4 color = Color_4.BLUE;
color.setName("红色");
System.out.println(color.getName());  //设置不恰当,输出为:null

color.setName("蓝色");
System.out.println(color.getName());

}

}
输出:

设置属性名称不恰当
null
蓝色

四 类集对枚举的支持——EnumMap和EnumSet(1)EnumMap的简单使用i)构造方法如下:public EnumMap(Class<K> keyType)ii)简单示例:
package javase.enumdemo;

import java.util.EnumMap;
import java.util.Map;

enum Color_5 {
RED, GREEN, BLUE;
}

public class EnumMapDemo {
public static void main(String[] args) {
Map<Color_5, String> map = new EnumMap<Color_5, String>(Color_5.class);
map.put(Color_5.RED, "红色");
map.put(Color_5.BLUE, "蓝色");
//遍历
for (Map.Entry<Color_5, String> mapEntry : map.entrySet())
System.out.println(mapEntry.getKey().name() + " --> "
+ mapEntry.getValue());
}

}
输出:
RED --> 红色
BLUE --> 蓝色
(2)EnumSet的几种常用方法示例:
package javase.enumdemo;

import java.util.EnumSet;

public class EnumSetDemo {
/**
* 将全部枚举类型添加到EnumSet集合中
* */
public void allOfTest(){
EnumSet<Color_5> set = EnumSet.allOf(Color_5.class);
for(Color_5 color : set)
System.out.print(color + "\t");
System.out.println();
}

/**
* 只设置一个枚举类型到集合中
* */
public void ofTest(){
EnumSet<Color_5> set = EnumSet.of(Color_5.BLUE);
for(Color_5 color : set)
System.out.println(color);
}

/**
* 创建一个只能添加指定内容的空集合
* */
public void noneOfTest(){
EnumSet<Color_5> set = EnumSet.noneOf(Color_5.class);
set.add(Color_5.RED);
set.add(Color_5.GREEN);

for(Color_5 color : set)
System.out.print(color + "\t");
System.out.println();

}

/**
* 创建不包含指定元素的集合
* */
public void complementOfTest(){
EnumSet<Color_5> oldSet = EnumSet.of(Color_5.BLUE,Color_5.GREEN);
EnumSet<Color_5> newSet = EnumSet.complementOf(oldSet);

for(Color_5 color : newSet)
System.out.print(color + "\t");
System.out.println();
}

/**
* 复制已有集合中的内容
* */
public void copyOfTest(){
EnumSet<Color_5> oldSet = EnumSet.of(Color_5.RED,Color_5.GREEN);
EnumSet<Color_5> newSet = EnumSet.copyOf(oldSet);

for(Color_5 color : newSet)
System.out.print(color + "\t");
System.out.println();
}

public static void main(String[] args) {
EnumSetDemo enumSetDemo = new EnumSetDemo();
enumSetDemo.allOfTest();
System.out.println("******************http://www.zifangsky.cn**********************");

enumSetDemo.ofTest();
System.out.println("******************http://www.zifangsky.cn**********************");

enumSetDemo.noneOfTest();
System.out.println("******************http://www.zifangsky.cn**********************");

enumSetDemo.complementOfTest();
System.out.println("******************http://www.zifangsky.cn**********************");

enumSetDemo.copyOfTest();
}

}
输出:

RED	GREEN	BLUE
******************http://www.zifangsky.cn**********************
BLUE
******************http://www.zifangsky.cn**********************
RED	GREEN
******************http://www.zifangsky.cn**********************
RED
******************http://www.zifangsky.cn**********************
RED	GREEN

五 让枚举类实现一个接口 枚举类实现一个接口,因为接口中含有抽象方法,因此枚举类中的每个对象都需要分别实现接口中的抽象方法,示例代码如下:
package javase.enumdemo;

interface Print{
public String getColor();
}
/**
* 枚举类实现了一个接口Print
* 因此枚举类中的每个对象都必须分别实现接口中的抽象方法
* */
enum Page implements Print{
WHITEPAGE{
public String getColor() {
return "白色";
}
},BLUEPAGE{
public String getColor() {
return "蓝色";
}
},GRAYPAGE{
public String getColor() {
return "灰色";
}
};

}

public class InterfaceEnumDemo {
public static void main(String[] args) {
Page page = Page.GRAYPAGE;
System.out.println(page.getColor());
}

}
输出:
灰色

六 在枚举类中定义抽象方法 跟前面枚举类实现一个接口类似,也需要枚举类中的每个对象分别实现其抽象方法,示例代码如下:
package javase.enumdemo;

/**
* 枚举中定义抽象方法
* 同样,枚举类中的每个对象都必须分别实现该抽象方法
* */
enum Person{
STUDENT{
public String getJobName() {
return "学生";
}
},TEACHER{
public String getJobName() {
return "教师";
}
},PROGRAMMER{
public String getJobName() {
return "程序猿";
}
};
public abstract String getJobName();  //抽象方法
}

public class AbstractMethodDemo {
public static void main(String[] args) {
Person person = Person.PROGRAMMER;
System.out.println(person.getJobName());
}

}
输出:
程序猿
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 枚举 Java基础