【枚举】_Enum笔记
本章目标:
掌握enum关键字与Enum类的关系
了解Enum类中提供的常用方法
3、具体内容
Enum
从前面已经清楚的知道,使用enum关键字可以定义一个枚举,实际上此关键字表示的是java.lang.Enum类型,即:使用enum声明的枚举类型,就相当于定义一个类,而此类则默认继承java.lang.Enum类。
java.lang.Enum类的定义如下:
public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>,Serializable
此类定义的时候使用了泛型机制,而且实现了Comparable接口以及Serializable接口,证明此种类型是可以比较,可以被序列化的。
Enum类的构造方法
protected Enum(String name,int ordinal)
枚举类的主要操作方法:
构造方法中接收两个参数,一个表示枚举的名字,另外一个表示枚举的序号。
RED实际上就表示的是枚举的名称,默认的编号是0;
如果此时,希望做一些改进,希望可以使用一些文字表示颜色的信息,则可以按照最早的Color类的形式,在枚举类中定义属性及自己的构造方法,但是一旦定义有参构造之后,在声明枚举对象的时候就必须明确的调用构造方法,并传递参数。
如果现在不想通过构造设置内容,而是希望通过setter()方法设置内容,则就必须按如下的方式执行。
发现,使用构造方法似乎更方便一些。
对于枚举.class 是随后要讲解的java反射机制中的内容,现在只需要按照此格式编写即可。
在枚举中实际上已经实现好了Comparable接口,所以枚举中的内容是可以排序的。
可以发现,按照序号进行排序的操作。
本章目标:
掌握enum关键字与Enum类的关系
了解Enum类中提供的常用方法
3、具体内容
Enum
从前面已经清楚的知道,使用enum关键字可以定义一个枚举,实际上此关键字表示的是java.lang.Enum类型,即:使用enum声明的枚举类型,就相当于定义一个类,而此类则默认继承java.lang.Enum类。
java.lang.Enum类的定义如下:
public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>,Serializable
此类定义的时候使用了泛型机制,而且实现了Comparable接口以及Serializable接口,证明此种类型是可以比较,可以被序列化的。
Enum类的构造方法
protected Enum(String name,int ordinal)
枚举类的主要操作方法:
构造方法中接收两个参数,一个表示枚举的名字,另外一个表示枚举的序号。
public enum Color{
RED,GREEN,BLUE;
}
RED实际上就表示的是枚举的名称,默认的编号是0;
public class GetEnumInfo{
public static void main(String args[]){
for(Color c:Color.values()){
System.out.println(c.ordinal()+"-->"+c.name());
}
}
}
如果此时,希望做一些改进,希望可以使用一些文字表示颜色的信息,则可以按照最早的Color类的形式,在枚举类中定义属性及自己的构造方法,但是一旦定义有参构造之后,在声明枚举对象的时候就必须明确的调用构造方法,并传递参数。
enum Color{
RED("红色"),GREEN("绿色"),BLUE("蓝色");
private Color(String name){
this.setName(name);
}
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
public class ConstructionEnum{
public static void main(String args[]){
for(Color c:Color.values()){
System.out.println(c.ordinal()+"-->"+c.name()+"("+c.getName()+")");
}
}
}
如果现在不想通过构造设置内容,而是希望通过setter()方法设置内容,则就必须按如下的方式执行。
enum Color{
RED,GREEN,BLUE;
private String name;
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;
}
}
this.name = name;
}
public String getName(){
return this.name;
}
}
public class SetEnum{
public static void main(String args[]){
Color c = Color.BLUE; //得到蓝色
c.setName("兰色"); //名字错误
c.setName("蓝色"); //名字正确
System.out.println(c.getName());
}
}
发现,使用构造方法似乎更方便一些。
enum Color{
RED,GREEN,BLUE;
private String name;
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;
}
}
this.name = name;
}
public String getName(){
return this.name;
}
}
public class SetEnum{
public static void main(String args[]){
Color c = Color.valueOf(Color.class,"BLUE"); //得到蓝色
c.setName("兰色"); //名字错误
c.setName("蓝色"); //名字正确
System.out.println(c.getName());
}
}
对于枚举.class 是随后要讲解的java反射机制中的内容,现在只需要按照此格式编写即可。
在枚举中实际上已经实现好了Comparable接口,所以枚举中的内容是可以排序的。
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
enum Color{
RED,GREEN,BLUE;
}
public class ComparableEnum{
public static void main(String args[]){
Set<Color> t = new TreeSet<Color>();
t.add(Color.GREEN);
t.add(Color.RED);
t.add(Color.BLUE);
Iterator<Color> iter = t.iterator();
while(iter.hasNext()){
System.out.print(iter.next()+"、");
}
}
}
可以发现,按照序号进行排序的操作。