Java枚举类型的使用,亲测有效
下面是Java模仿实现枚举类型,可以大概了解其原理:
package learn.java.enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* @author 作者 : YUHU YUAN
* @date 创建时间:2016年12月9日 下午10:31:37
* @version 1.0
*/
public abstract class WeekDateYuan {
public abstract WeekDateYuan nextDay();
public abstract WeekDateYuan proDay();
public abstract String toString();
private String name;
private int order;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public WeekDateYuan(String name, int order){
this.name = name;
this.order = order;
}
public static final WeekDateYuan Monday = new WeekDateYuan("Monday",1){
@Override
public WeekDateYuan nextDay(){
return Tuesday;
}
@Override
public WeekDateYuan proDay(){
return Sunday;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Monday";
}
};
public static final WeekDateYuan Tuesday = new WeekDateYuan("Tuesday",2){
@Override
public WeekDateYuan nextDay(){
return Wednesday;
}
@Override
public WeekDateYuan proDay(){
return Monday;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Tuesday";
}
};
public static final WeekDateYuan Wednesday = new WeekDateYuan("Wednesday",3){
@Override
public WeekDateYuan nextDay(){
return Thrusday;
}
@Override
public WeekDateYuan proDay(){
return Tuesday;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Wednesday";
}
};
public static final WeekDateYuan Thrusday = new WeekDateYuan("Thrusday",4){
@Override
public WeekDateYuan nextDay(){
return Friday;
}
@Override
public WeekDateYuan proDay(){
return Wednesday;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Thrusday";
}
};
public static final WeekDateYuan Friday = new WeekDateYuan("Friday",5){
@Override
public WeekDateYuan nextDay(){
return Saturday;
}
@Override
public WeekDateYuan proDay(){
return Thrusday;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Friday";
}
};
public static final WeekDateYuan Saturday = new WeekDateYuan("Monday",6){
@Override
public WeekDateYuan nextDay(){
return Sunday;
}
@Override
public WeekDateYuan proDay(){
return Friday;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Saturday";
}
};
public static final WeekDateYuan Sunday = new WeekDateYuan("Sunday",7){
@Override
public WeekDateYuan nextDay(){
return Saturday;
}
@Override
public WeekDateYuan proDay(){
return Monday;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Sunday";
}
};
private static Map<String, WeekDateYuan> valueMap = new HashMap<>();
/**
* 保存枚举成员
*/
public static WeekDateYuan[] values = {
Monday, Tuesday, Wednesday, Thrusday, Friday, Saturday, Sunday
};
//初始化
static {
valueMap.put("Monday", values[0]);
valueMap.put("Tuesday", values[1]);
valueMap.put("Wednesday", values[2]);
valueMap.put("Thrusday", values[3]);
valueMap.put("Friday", values[4]);
valueMap.put("Saturday", values[5]);
valueMap.put("Sunday", values[6]);
}
public static WeekDateYuan valueOf(String name) {
if (name.equalsIgnoreCase("MON")) {
return Monday;
} else if (name.equalsIgnoreCase("TUES")) {
return Tuesday;
} else if (name.equalsIgnoreCase("WEDES")) {
return Wednesday;
} else if (name.equalsIgnoreCase("THURS")) {
return Thrusday;
} else if (name.equalsIgnoreCase("FRI")) {
return Friday;
} else if (name.equalsIgnoreCase("SATUR")) {
return Saturday;
} else if (name.equalsIgnoreCase("SUN")) {
return Sunday;
} else {
throw new IllegalArgumentException("找不到" + name + "枚举类型!");
}
}
public static WeekDateYuan valueOf_2(String name) {
WeekDateYuan value = valueMap.get(name.toUpperCase());
if (value == null) {
throw new IllegalArgumentException("找不到" + name + "枚举类型!");
}
return value;
}
}
下面是具体的枚举类的使用:
package learn.java.enumeration;
/**
* @author YuanYuhu
*
*/
public enum WeekdateYu {
Monday("Monday", 1) ,Tuesday("Tuesday",2),Wednesday("Wednesday", 3),
Thrusday("Thrusday", 4),Friday("Friday", 5),Saturday("Monday", 6),Sunday("Sunday", 7);
private String name;
private int order;
public static WeekdateYu nextDay(WeekdateYu element){
WeekdateYu next = null;
WeekdateYu[] weeks = WeekdateYu.values();
next = weeks[(element.ordinal()+1)%7];
return next;
}
public static WeekdateYu proDay(WeekdateYu element){
WeekdateYu pre = null;
WeekdateYu[] weeks = WeekdateYu.values();
int order = (element.ordinal()-1) > 0 ? (element.ordinal()-1):(element.ordinal()-1+7);
pre = weeks[order];
return pre;
}
WeekdateYu(String name, int order){
this.name = name;
this.order = order;
}
public String getName(){
return name;
}
public int getOrder(){
return order;
}
}
package learn.java.enumeration;
/**
* @author 作者 : YUHU YUAN
* @date 创建时间:2016年12月9日 下午10:23:10
* @version 1.0
*
*/
public enum WeekDateEnum {
MON {
@Override
public WeekDateEnum nextDay() {
return TUES;
}
@Override
public WeekDateEnum preDay() {
return SUN;
}
}, TUES {
@Override
public WeekDateEnum nextDay() {
return WEDNES;
}
@Override
public WeekDateEnum preDay() {
return MON;
}
}, WEDNES {
@Override
public WeekDateEnum nextDay() {
return THURS;
}
@Override
public WeekDateEnum preDay() {
return TUES;
}
}, THURS {
@Override
public WeekDateEnum nextDay() {
return FRI;
}
@Override
public WeekDateEnum preDay() {
return WEDNES;
}
}, FRI {
@Override
public WeekDateEnum nextDay() {
return SATUR;
}
@Override
public WeekDateEnum preDay() {
return THURS;
}
}, SATUR {
@Override
public WeekDateEnum nextDay() {
return SATUR;
}
@Override
public WeekDateEnum preDay() {
return FRI;
}
}, SUN {
@Override
public WeekDateEnum nextDay() {
return SATUR;
}
@Override
public WeekDateEnum preDay() {
return MON;
}
};
private WeekDateEnum() {}
/**
* 下一天
* @return
*/
public abstract WeekDateEnum nextDay();
/**
* 前一天
* @return
*/
public abstract WeekDateEnum preDay();
}
针对上面的两种情况进行一下解释:
1:注意把方法声明为虚拟的和静态的两种使用方法的不同;
2:个人感觉声明为静态的是所有成员共有的方法,声明为虚拟的则是不同的成员有各自不同的实现的时候用。
3:有了枚举类型就可以更好的结合switch使用,也可以参与到设计模式里面的状态模式里面,正好这两天看这些内容。
另外,以上纯属个人观点。