你用过枚举么----枚举成神之路

文章目录

  • 为何用枚举
  • name()方法获取枚举字符串值
  • ordinal()方法获取从0开始的序号
  • valueOf(String name)根据字符串值获取枚举实例
  • values()返回枚举实例的数组
  • 枚举的属性和方法
  • 枚举实现接口
  • 枚举定义抽象方法
  • 枚举的优雅使用代替if/else
  • 枚举的单例实现

为何用枚举

小明同学第一次学习枚举,老师的例子是一周的每个星期,一年的每个月份,然后他懂了,对于范围、类别等,可以列举出来的变量,可以使用枚举类型。后来他发现,用1/2/3…7代替一周的7天也行啊,不一定要枚举,结果老师给他一个参数8,他忽然明白了,用枚举限定了输入范围,不需要添加判断,同时如果对于星期一,用1表示的话,可能过几天再看我都不知道一代表啥,但如果用Week.MONDAY,很明白代表星期一,于是,小明开始了枚举之路。

name()方法获取枚举字符串值

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();
    }

ordinal()方法获取从0开始的序号

改好之后,小明又觉得自己行了,直到有一天交作业

public int getOrderByType(FriendType type) {
        if (type == FriendType.GOOD) {
            return 0;
        } else {
            return 1;
        }
    }

老师又疯了,你不知ordinal()(返回从0开始的序号)么,于是小明有了如下版本

public int getOrderByType(FriendType type) {
        return type.ordinal();
    }

valueOf(String name)根据字符串值获取枚举实例

小明心里不服,还能有啥啊,直到一天:

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);
    }

values()返回枚举实例的数组

枚举的属性和方法

老师很生气说:你太笨了,枚举用不明白,但为师不忍看你如此无知,再传授你几招吧,你说说,枚举的本质是神马啊?

小明:这个我知道,是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

小明说:老师,我发现这种方式可以有效的解决我的好多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");
    }
}

就这样,小明顺利学完枚举,成为枚举大神~

你可能感兴趣的:(Java基础)