小明同学第一次学习枚举,老师的例子是一周的每个星期,一年的每个月份,然后他懂了,对于范围、类别等,可以列举出来的变量,可以使用枚举类型。后来他发现,用1/2/3…7代替一周的7天也行啊,不一定要枚举,结果老师给他一个参数8,他忽然明白了,用枚举限定了输入范围,不需要添加判断,同时如果对于星期一,用1表示的话,可能过几天再看我都不知道一代表啥,但如果用Week.MONDAY,很明白代表星期一,于是,小明开始了枚举之路。
public enum FriendType {
GOOD, BAD
}
然后调用的时候:
public Friend addFriend(String name, boolean isgood) {
if (isgood) {
return new Friend(name, FriendType.GOOD);
} else {
return new Friend(name, FriendType.BAD);
}
}
心里美滋滋,直到有一天交作业如下
public String getNameByType(FriendType type) {
if (FriendType.GOOD == type) {
return "GOOD";
} else {
return "BAD";
}
}
老师疯了,你为何如此get,不知道name()(返回name,比如FriendType.GOOD.name()为GOOD),于是有了如下的版本:
public String getNameByType(FriendType type) {
return type.name();
}
改好之后,小明又觉得自己行了,直到有一天交作业
public int getOrderByType(FriendType type) {
if (type == FriendType.GOOD) {
return 0;
} else {
return 1;
}
}
老师又疯了,你不知ordinal()(返回从0开始的序号)么,于是小明有了如下版本
public int getOrderByType(FriendType type) {
return type.ordinal();
}
小明心里不服,还能有啥啊,直到一天:
public FriendType getType(String type) {
if (type.equals("GOOD")) {
return FriendType.GOOD;
}
return FriendType.BAD;
}
老师又疯了,你不知道**valueOf()(更具name返回枚举常量,比如根据"GOOD"返回FriendType.GOOD)**么,于是乎小明改了代码
public FriendType getType(String type) {
return FriendType.valueOf(type);
}
老师很生气说:你太笨了,枚举用不明白,但为师不忍看你如此无知,再传授你几招吧,你说说,枚举的本质是神马啊?
小明:这个我知道,是class
老师吃惊,这家伙居然知道:那如果是类的话,我想定义属性和方法怎么定义啊?
小明:额,还可以这样么(黑人问号???)
老师说:小样,功力欠缺,为师让你看看。
public enum FriendType {
GOOD("成绩好"), BAD("成绩坏");
private String reason;
private FriendType(String reason) {
this.reason = reason;
}
public String getReason() {
return reason;
}
public String getReasonByStrType(String type) {
for (FriendType ft : FriendType.values()) {
if (ft.name().equals(type)) {
return ft.getReason();
}
}
return null;
}
}
老师说,小明啊,这下你开开眼吧
小明吃惊啊,琢磨了一会儿说,老师很厉害,但我看明白了,构造方法是私有的,因此无法在外部再增加枚举类型的实例,有参构造函数可以使得每个实例对变量赋值,同时values()可以将枚举常量以数组形式返回,我也会了,老师你还有别的招么?再教我一下。
老师看小明想学,说:好,我再给你放个大
// 该接口表示你的两类盆友都如何对待学习的
public interface IStudy {
//该接口有一个方法,即howToStudy(如何学习)
public abstract void howToStudy();
}
public enum FriendType implements IStudy{
GOOD{
@Override
public void howToStudy() {
System.out.println("study hard");
}
},
BAD{
@Override
public void howToStudy() {
System.out.println("study not hard");
}
}
}
枚举实现接口,可以在公共区域实现,也可以在内部实现,调用的话:FriendType.GOOD.howToStudy().
小明甚是惊喜,没想到还能这么实现接口,涨了见识
小明说:老师,其实不一定实现接口,直接把抽象方法写在本类中,在每个枚举实例中进行实现可以么,于是有了另一个版本
public enum FriendType {
GOOD{
@Override
public void howToStudy() {
System.out.println("study hard");
}
},
BAD{
@Override
public void howToStudy() {
System.out.println("study not hard");
}
};
public abstract void howToStudy();
}
小明说:老师,我发现这种方式可以有效的解决我的好多if/else,着实优雅不少啊,你看我这么实现,本来6行代码可以用1行搞定
public void friendStudy(String typeName) {
// if (typeName == "GOOD") {
// FriendType.GOOD.howToStudy();
// }
// else {
// FriendType.BAD.howToStudy();
// }
FriendType.valueOf(typeName).howToStudy();
}
小明对老师非常敬佩,老师也发现小明举一反三很聪明。小明终于学完要走了,老师交代:设计模式中的单例可以用枚举实现,你会么?
小明说:我写给你看下。
public enum Singleton {
INSTANCE;
public Singleton getInstance() {
return INSTANCE;
}
public void doSomeThing() {
System.out.println("doSomeThing");
}
}
就这样,小明顺利学完枚举,成为枚举大神~