文档章节

浅谈Java中的枚举类型

myyin
 myyin
发布于 2014/09/09 17:13
字数 1456
阅读 99
收藏 0

        虽然自己也是搞Java的,但是初来乍到有很多不知道的东西。工作了,在看公司代码的时候,发现公司代码里面很多都是用的枚举类型,因为之前只听过枚举类型这个名词,但是当真的见到这家伙的时候,根本认不出来,不仅我不认识他,他对我也是同样的陌生。当抱着所谓的求知的精神往里面看的时候(什么求知精神啊,不看不行啊,),才发现这家伙根本不是什么新鲜的玩意,因为之前学习过C语言,自认为学的还不错啊(有点吹牛X啊),所以还是有那么一点似曾相识的感觉啊。据说是在Java1.5才有的,其实也不是什么新技术,只不过sun公司,哦是Oracle公司封装的更好罢了,仅此而已!说了这么多的废话了,该说点有用的了,这是自己第一次在自己的博客中认真的写点东西,虽然申请博客无数,当然开源中国也是不放过的,别被管理员看到把我拉黑了。呀!这又扯远了,言归正传啊。

    肯定有人会问,什么是枚举类型?它是一种构造数据类型。枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。以上红色字体是百度百科对她的解释,与本人无关。说实话,我也看不懂是什么意思,即使看懂了,也用不了。哈哈,在回答什么是枚举类型之前,不妨给大家讲一个故事。

Java中的类与对象对于能看到这里的朋友来说,想必已经是熟悉的再不能熟悉的东西了。那我们就以他来入手,好比我们现在要定义一个人类,每个人都有姓名、年龄、性别。说道这里可能有的人会开始较劲的,那谁谁没有姓名,更有甚者说,那谁谁都不知道自己是男是女!这都是例外。这个类应该这样写

public class Person{
    private String name;
    private Integer age;
    private    ?    sex;
}

性别该用什么类型呢?有的人会说用个String类型不就行了,那有什么大不了。行!就用一个String类型

private String sex;

那要是我们想创造一个人怎么办呢?(听起来好像怪怪的啊?),有人会说了那很简单啊,直接new不就行了。

Person person = new Person("张三",20,"男");

是!确实是正确的,但是如果有家伙偏偏要这样呢?

Person person1 = new Person("李四",25,"你猜?");

上面这一条语句,从语法上来说没有一点错,但是逻辑上似乎不太合理啊!问你是男的还是女的,结果你来了一句,你猜。那不是闹笑话吗,不去厕所谁知道你是男还是女啊!(况且有时候去了厕所也不一定知道啊,呵呵)。如果过把性别设置成String类型的话,就存在很多的不定性了。只要是字符串类型的,我就可以随便的往里面赋值。那可能又有人说了,用Boolean类型吧!我们规定一下用true代替男人,false代替女人。这似乎可以啊!但是谁说了男人就是true男人?女人就是false女人?况且ture和男人有什么联系吗?很显然这是不合理的。况且这是性别,如果换做是血型呢?没有办法了吧?这时我们不妨用类定义,在这个类中添加俩个静态的属性,一个是男,一个是女。可是怎么解决只能创建俩个对象的问题呢?那只能把构造方法私有化了,综上所述的代码如下

public Class Sex{
    private String sex;
    public static final MALE = new Sex("男");
    public static final FEMALE = new Sex("女");
    
    private Sex(String sex){
        this.sex = sex;
    }
}

这样我们的重新定义Person类了,

public class Person{
    private String name;
    private Integer age;
    private Sex sex;
}

在创建一个Person对象的时候只需

Person person2 = new Person("王五",24,Sex.MALE);
Person person3 = new Person("翠花",25,Sex.FEMALE);

那么如果我想看看翠花是不是女的该怎么办呢?难道真的的往厕所带?当然不用了。只需要

System.out.println(person3.getSex());

是不是这样就知道翠花是男是女了?别着急嘛!此时你看到的只是这个对象的hashCode,如果真的那么的急切知道翠花是男是女,那你就必须要在Sex类中重新写她的toString()方法了。

public Sting toString(){
    return this.sex;
}

扯到这里,故事算是讲完了。也把我们一开始提出的问题给解决了,可能有人会问了,这不是一个Java的事例吗?怎么是故事呢?我是不会告诉你我是一个有情怀的人的,哈哈。还可能有人会恼火了,不是讲枚举类型吗?怎么说了一堆的废话,你他XX……。不要生气,不要着急。当你看到这里的时候,如果你已经知道类似这样某个”变量“的值只能在某几个常量中选取这样的问题怎么解决时,说明你已经会用枚举类型了,就差有人告诉你你会的那个玩意叫枚举类型了。其实这就是枚举类型的原理吧!如果小白我说的有问题,希望你您能在喷的间隙,擦掉口水,指出错误所在。如果不想自己写枚举类型,而用Java集成好的,那你就看下一篇吧!

© 著作权归作者所有

共有 人打赏支持
myyin
粉丝 0
博文 6
码字总数 5856
作品 0
朝阳
私信 提问
Java中枚举的线程安全性及序列化问题

来源:微信公众号 ,原创: Hollis --枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字...

Java填坑之路
2018/08/02
0
0
浅谈Kotlin(一):简介及Android Studio中配置

浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型、基本语法、代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言:   今日新闻:谷歌宣布,将Kotli...

听着music睡
2017/05/18
0
0
Java语言学习(十一):枚举类型和泛型

Java中一个重要的类型:枚举,它可以用来表示一组取值范围固定的变量,使用 enum 关键字定义枚举类型,其中元素不能重复,通常大写表示。利用Java的反射机制,可以在运行时分析类,如查看枚举...

海岸线的曙光
2018/07/18
0
0
java 枚举(enum) 全面解读

简介 枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊类,它和普通类一样可以使用构造器、定义成员变量和方法,也能实现一个或多个接口,但枚举类不能继承其他类....

jimmie_yang
2018/10/19
0
0
为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

2018/06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

声学所实验室的论文

https://hccl.ioa.ac.cn/output/papers/

shengjuntu
27分钟前
0
0
Mysql(Mariadb)数据库主从复制

Mysql主从复制的实现原理图大致如下: MySQL之间数据复制的基础是以二进制日志文件(binary log file)来实现的,一台MySQL数据库一旦启用二进制日志后,其作为master,它数据库中所有操作都...

linux-tao
今天
2
0
Mysql(Mariadb)数据库主从复制

Mysql主从复制的实现原理图大致如下: MySQL之间数据复制的基础是以二进制日志文件(binary log file)来实现的,一台MySQL数据库一旦启用二进制日志后,其作为master,它数据库中所有操作都...

Linux就该这么学
今天
2
0
Mysql(Mariadb)数据库主从复制

Mysql主从复制的实现原理图大致如下: MySQL之间数据复制的基础是以二进制日志文件(binary log file)来实现的,一台MySQL数据库一旦启用二进制日志后,其作为master,它数据库中所有操作都...

xiangyunyan
今天
2
0
Android 贝塞尔曲线实践——旋转的七色花朵

一、关于贝塞尔曲线 在工业设计方面贝塞尔曲线有很多用途,同样,在Android中,贝塞尔曲线结合Path类可以实现更复杂的图形,这里我们给一个案例,来实现一种旋转的花朵。对于贝赛尔曲线的理解...

IamOkay
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部