java枚举的高端玩法

首先呢,这篇文章虽然让你看起来很不舒服。但是,没办法,作者就是很懒,就是不爱搞样式,略略略,作者能看懂就行。哈哈哈,接下来咱们进入正题。
先简单介绍一下枚举的用法,据目前咱的了解,一般来说 对于业务中,那些固定的数据,都可以使用枚举,从而提高代码逼格。假设,你现在需要写一个商品的实体类,除了那些id啊,名字啊,价格啊,可能你还需要记录一下商品适合在某个季节推荐出去,毕竟总不能大夏天推荐棉衣吧,哈哈哈哈。那么我们就可以在数据库中添加一个关于季节的字段,season,关于他的数据类型是什么,这不重要,咱们关注的是java端的实体类。实体类中就必然要有一个属性对应数据库中的字段,那么这个属性是什么类型呢

public class ShangPin {
    private String id;
    private String name;
    private Date createTime;
    //.........
    private String season;
}

LOOK,大多数人都会想到使用String来表示,其实还有一种逼格更高的方式,就是使用枚举

public class ShangPin {
    private String id;
    private String name;
    private Date createTime;
    //.........
    private Season season;
}

我们分析一波先,季节这个东西本来就是春夏秋冬,不太可能出现第五个季节,也不太可能有一个季节的名字发生变化。咱们用一手枚举,还是挺骚气的,这个枚举还有个更厉害的操作,不知道你们有没有发现。它很像数据字典耶,有木有。(对于数据字典不太明白滴,出门百度,自己搜搜)
那么千言万语,说了一堆废话,终于引出了枚举,接下来,咱们看一下枚举比较好玩的地方。

public enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;
}

这个枚举,大家应该是再熟悉不过了,其实如果用到这里,这个枚举还是没什么意思的,咱们这篇文章是枚举的高端玩法,当然玩一些不一样的东西,比如,咱们改造改造。

public enum Season {
    SPRING("春"),
    SUMMER("夏"),
    AUTUMN("秋"),
    WINTER("冬");
}

这两种的区别在于,一个加了汉字,另一个没加,哈哈哈。当然如果你直接复制第二个代码放到你的IDEA中,一定会报错,也就是你括号里面的那个东西,会飘红线,比如这样
在这里插入图片描述
但是别着急,看接下里的代码

public enum Season {
    SPRING("春"),
    SUMMER("夏"),
    AUTUMN("秋"),
    WINTER("冬");
    
    private String name;
    
    Season(String name){
        this.name=name;
    }
}

哦豁,这个东西怎么瞅起来变得像个类了,然后就会有童鞋迫不及待的去尝试new个对象,然后发现,控制台告诉你,枚举不能被实例化,哈哈哈。那这个构造函数的目的是什么呢,既然枚举没办法实例化,那为什么要有构造函数。其实我们可以干这样的一件事。

public enum Season {
    SPRING("春"),
    SUMMER("夏"),
    AUTUMN("秋"),
    WINTER("冬");

    private String name;

    Season(String name){
        System.out.println("谁调用了我");
        this.name=name;
    }
}

在他的构造方法添加这样一句话,也就是说如果构造方法被调用的时候,这句话就会输出,那么我们顺藤摸瓜就可以找到这个构造方法存在的意义了。这个道理如果明白的话,那么我们不妨先等一会再行动,这个枚举类中有个成员属性叫做name,构造方法干了一件事情,给name赋值,那么是否好奇谁调用了构造方法,并且谁给name赋值,以及赋了什么值,所以说,我们改一下代码

public enum Season {
    SPRING("春"),
    SUMMER("夏"),
    AUTUMN("秋"),
    WINTER("冬");

    private String name;

    Season(String name){
        System.out.println("谁调用了我"+",参数为"+name);
        this.name=name;
    }
}

ok,这样的话,我们就能很轻松的知道谁调用了构造方法,参数是什么了,接下来,我们写个新的类,作为main方法,但是这个main方法我们要写什么代码呢?如果你对jvm有一点了解的话,其实你应该需要让jvm加载这个枚举的字节码,因为如果你不加载这个枚举的字节码的话,那么构造方法一定不可能会被调用。所以,我们在main里面写这样的一段代码。

public class Mani {
    public static void main(String[] args) {
        Season summer = Season.SUMMER;
    }
}

然后准备好,带着你脑海的想法和认为的结果,我们开始运行
在这里插入图片描述
看看,有没有一种恍然大明白的感觉,原来jvm加载这个类的字节码文件的时候,枚举就会自己偷偷摸摸的帮你调用了自己的构造方法,枚举里面声明了几个常量,那么就帮你调用几次,如果说,你在枚举常量后面跟上了一个括号,我这里跟上的是春夏秋冬,那么这些东西,会作为参数传递给构造方法。
接下来还有一些注意的东西,我这里不贴代码了,直接上话术解释!
枚举中有一个方法,即为枚举.常量.name()这个方法,我跟你们讲 这个name()和我刚才定义的属性name一毛钱关系都没有,前者返回的是常量值,后者属性name为括号里面跟着的东西,而枚举的toString方法会默认返回的是常量值,所以我们可以通过重写toString,让它实现返回我们想要返回的东西。
还有个比较骚的知识点,上面的例子当中,我括号里面只写了一个参数,其实也可以写两个参数,那么就需要有对应的构造方法以及属性,希望你们可以自己下去试一试,就这样吧。嘻嘻,下课!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值