枚举
来源:互联网 发布:淘宝需要品牌授权 编辑:程序博客网 时间:2024/06/06 01:48
1、问题:
一个类型的设计者不仅设计一个类型还要设计这个类型的值,使该类型的使用者使用固定的值。
2、类实现:
将大量的if else语句,使用抽象方法转移成一个个独立的类。
大量if-else语句
public class practice {
public static void main(String[] args){
WeekDay wkd = WeekDay.SUN;
System.out.println(wkd.nextDay());
}
}
class WeekDay{
private WeekDay(){}
public static final WeekDay SUN = new WeekDay();
public static final WeekDay MON = new WeekDay();
public WeekDay nextDay(){
if(this == SUN)
return MON;
else
return SUN;
}
public String toString(){
return this == SUN?"SUN":"MON";
}
}
public class practice {
public static void main(String[] args){
WeekDay wkd = WeekDay.SUN;
System.out.println(wkd.nextDay());
}
}
用抽象类将if-else语句转移成一个个独立的类
abstract class WeekDay{
private WeekDay(){}
public static final WeekDay SUN = new WeekDay(){
public WeekDay nextDay(){
return MON;
}
};
public static final WeekDay MON = new WeekDay(){
public WeekDay nextDay(){
return SUN;
}
};
public abstract WeekDay nextDay();
// public WeekDay nextDay(){
// if(this == SUN)
// return MON;
// else
// return SUN;
// }
public String toString(){
return this == SUN?"SUN":"MON";
}
}
3、语法
(1)基本结构:
public enum WeekDay{
SUN,MON,TUE;//如果只有这个几个属性,没有构造方法等其他成员,分号可以不写
}
WeekDay wkd = WeekDay.SUN;
(2)一些方法:
System.out.println(wkd);//自动实现了toString()方法
System.out.println(wkd.name())//答案:SUN
System.out.println(wkd.ordinal())//排行第几 答案:1
静态方法: System.out.println(WeekDay.valueOf("SUN"));//把一个串变成一个enum值,生成一个enum对象
(3)构造方法:
要求所有的构造方法在成员列表之后。
构造方法的访问属性要求是private的。
public class practice {
public static void main(String[] args){
WeekDay wkd = WeekDay.SUN;//由于将成员变量看做是静态变量,所以每初始调用一次本类,都会给每个静态成员加载执行一次无参构造
System.out.println(wkd.name());
}
}
//和类是一样的 公共修饰的枚举名字和源文件名字必须相同
enum WeekDay{
SUN,MON,TUS,WED(1);
private WeekDay(){System.out.println("无参构造");}
//调用第二个有参构造的方法 表示创建这个元素的时候,调用哪个构造方法。
private WeekDay(int day){System.out.println("有参构造");}
}
(4)带有抽象方法
//枚举只有一个成员时,可以作为单例的实现方法
//属性是本类、静态、常量
//构造方法是属性
//newInstance都不需要写
enum TrafficLamp{
RED(45){//new子类的实际对象
//调用父类的构造方法
//RED的引用指向实际的对象
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(40){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(){}
private TrafficLamp(int time){this.time = time;}
}
一个类型的设计者不仅设计一个类型还要设计这个类型的值,使该类型的使用者使用固定的值。
2、类实现:
将大量的if else语句,使用抽象方法转移成一个个独立的类。
大量if-else语句
public class practice {
public static void main(String[] args){
WeekDay wkd = WeekDay.SUN;
System.out.println(wkd.nextDay());
}
}
class WeekDay{
private WeekDay(){}
public static final WeekDay SUN = new WeekDay();
public static final WeekDay MON = new WeekDay();
public WeekDay nextDay(){
if(this == SUN)
return MON;
else
return SUN;
}
public String toString(){
return this == SUN?"SUN":"MON";
}
}
public class practice {
public static void main(String[] args){
WeekDay wkd = WeekDay.SUN;
System.out.println(wkd.nextDay());
}
}
用抽象类将if-else语句转移成一个个独立的类
abstract class WeekDay{
private WeekDay(){}
public static final WeekDay SUN = new WeekDay(){
public WeekDay nextDay(){
return MON;
}
};
public static final WeekDay MON = new WeekDay(){
public WeekDay nextDay(){
return SUN;
}
};
public abstract WeekDay nextDay();
// public WeekDay nextDay(){
// if(this == SUN)
// return MON;
// else
// return SUN;
// }
public String toString(){
return this == SUN?"SUN":"MON";
}
}
3、语法
(1)基本结构:
public enum WeekDay{
SUN,MON,TUE;//如果只有这个几个属性,没有构造方法等其他成员,分号可以不写
}
WeekDay wkd = WeekDay.SUN;
(2)一些方法:
System.out.println(wkd);//自动实现了toString()方法
System.out.println(wkd.name())//答案:SUN
System.out.println(wkd.ordinal())//排行第几 答案:1
静态方法: System.out.println(WeekDay.valueOf("SUN"));//把一个串变成一个enum值,生成一个enum对象
(3)构造方法:
要求所有的构造方法在成员列表之后。
构造方法的访问属性要求是private的。
public class practice {
public static void main(String[] args){
WeekDay wkd = WeekDay.SUN;//由于将成员变量看做是静态变量,所以每初始调用一次本类,都会给每个静态成员加载执行一次无参构造
System.out.println(wkd.name());
}
}
//和类是一样的 公共修饰的枚举名字和源文件名字必须相同
enum WeekDay{
SUN,MON,TUS,WED(1);
private WeekDay(){System.out.println("无参构造");}
//调用第二个有参构造的方法 表示创建这个元素的时候,调用哪个构造方法。
private WeekDay(int day){System.out.println("有参构造");}
}
(4)带有抽象方法
//枚举只有一个成员时,可以作为单例的实现方法
//属性是本类、静态、常量
//构造方法是属性
//newInstance都不需要写
enum TrafficLamp{
RED(45){//new子类的实际对象
//调用父类的构造方法
//RED的引用指向实际的对象
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(40){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(){}
private TrafficLamp(int time){this.time = time;}
}
0 0