首页 技术 正文
技术 2022年11月9日
0 收藏 453 点赞 3,694 浏览 2588 个字

1.什么是枚举

枚举是jdk1.5后才增加的新特性

用枚举就是要规定一个新的类型,那么要用这个类型的值就必须是我规定的那些值。如果不是那些值,编译器就会报错,好处是编译时就会做出判断

2.用普通类模拟枚举的实现原理

  

package com.java.javaenhance1;
/**
* 用普通的java类,来实现枚举的原理
* 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象
* @author Administrator
*
*/
public class WeekDay { private WeekDay() {
} public final static WeekDay SUN = new WeekDay();
public final static WeekDay MON = new WeekDay(); public WeekDay nextDay() {
if (this == SUN) {
return MON;
} else {
return SUN;
}
} public String toString() {
return this == SUN ? "SUN" : "MON";
}}
package com.java.javaenhance1;public class EnumTest {    public static void main(String[] args) {        WeekDay weekDay = WeekDay.SUN;
System.out.println(weekDay.nextDay()); //MON
System.out.println(weekDay.toString()); //SUN
}}

这里还可以使用抽象方法的方式实现nextDay(),就将大量的if.else语句转义成了一个个独立的类。

package com.java.javaenhance1;
/**
* 用普通的java类,来实现枚举的原理
* 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象
* @author Administrator
*
*/
public abstract class WeekDay { private WeekDay() {
} //带一个{} 表示匿名子类
public final static WeekDay SUN = new WeekDay(){ @Override
public WeekDay nextDay() {
return MON;
}
};
public final static WeekDay MON = new WeekDay(){ @Override
public WeekDay nextDay() {
return SUN;
}
}; //还可以使用抽象类的方式,各自实现nextDay()
/*public WeekDay nextDay() {
if (this == SUN) {
return MON;
} else {
return SUN;
}
}*/
//nextDay分别有子类去完成
public abstract WeekDay nextDay(); public String toString() {
return this == SUN ? "SUN" : "MON";
}}

3.java5的枚举的基本应用

package com.java.javaenhance1;public class EnumTest {    public static void main(String[] args) {

WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2); //FRI 枚举自己实现了toString()
System.out.println(weekDay2.name());//FRI
System.out.println(weekDay2.ordinal()); //5 元素中排第几,第一个从0开始
//把一个字符串变成一个对象的枚举元素
System.out.println(WeekDay.valueOf("SUN")); //SUN
//把枚举中的所有元素装进数组里,可用于遍历
System.out.println(WeekDay.values().length); //

} /**
* 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象
* @author Administrator
*
*/
public enum WeekDay{
SUN,MON,TUE,WED,THI,FRI,SAT
}}

4.实现带有构造方法的枚举(带有参数的构造方法)

/**
* 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象
* @author Administrator
*
*/
public enum WeekDay{
SUN(1),MON,TUE,WED,THI,FRI,SAT; //定义的所有其他信息必须位于元素之后
private WeekDay(){System.out.println("first");} //构造方法必须是private类型的
private WeekDay(int day){System.out.println("second");}
}

在枚举元素的后边跟上一个括号,()中的参数代表元素初始化时用的哪个构造方法,如果没有(),表示调用默认空参构造器

5.实现带有抽象方法的枚举

内部类前边可以有4中访问修饰符,外部类只有两种,public和默认

带有抽象方法的枚举,元素需要实现抽象的方法,使用RED{} 匿名子类的方式

RED(30) 表示构造实例对象时用的是哪个构造方法

public enum TrafficLamp{
RED(30){ //使用内部类方式实现抽象类
@Override
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN(45){
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(5){
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time = time;}
}

 经过编译后,会自动生成子类的 .class文件

java高新技术-枚举

枚举只有一个成员时,就可以作为一种单例的实现方式。

如果要写一个单例,就可以写一个枚举,只有一个元素。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,135
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,603
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,446
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,220
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,855
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,941