Java基础学习总结(77)——Java枚举再总结
2016-11-13 17:55
218 查看
在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下
相信很多小伙伴,在实际开发中也是那么干的,既然这样已经能实现枚举的功能,为什么还要引入枚举呢?我们接着往下看当我们需要是同这组“int枚举”是代码如下
看起来这些貌似也没什么问题,但是我们知道,一个项目基本都是基于团队开发,或许只有你自己知道int类型的1代表gril,0代表Boy。其他同事看到这个函数根本不知道其中的含义,这样的代码很明显阅读性很差,从而会造成沟通成本很高。我们接着往下看,现在你为你的func写了很nice的注释,傻子都能看得懂(0
boy,1 gril)。但是项目组不可避免的总会出现那么一两个傻子,非要给你传个3进来,而且这样的错误编译器不会报任何错误,运行时会造成什么bug,这个只有乔老爷知道了。所以这样的代码是极不安全的。使用枚举就能很好的避免上面的问题,接下来我们就来理一理枚举的用法。
枚举用于存储数量有限的一组固定的数据集。使用场景:上面说到的性别的表示,一年四级春夏秋冬的表示,一周七天的表示,颜色的表示等等。
枚举的简单用法
枚举中还有一个ordinal()方法返回一个int值,这是每个enum实例在声明时的次序,从0开始。枚举类还实现了Compareable接口,所以他具有compareTo()方法。同时还实现了Serializable接口,还自动为你提供了equals()和hashCode()方法。除了不能继承一个枚举类之外,我们基本上可以把枚举类当成一个常规的Java类,可以往其中添加新的方法,包括抽象方法甚至main方法。
现在我们用枚举来实现上面的那个性别函数
这样既有很好的阅读性又避免的安全性问题
public static final int MAN = 0; public static final int WOMAN = 1;
相信很多小伙伴,在实际开发中也是那么干的,既然这样已经能实现枚举的功能,为什么还要引入枚举呢?我们接着往下看当我们需要是同这组“int枚举”是代码如下
public void showSex(int sex){ switch(sex){ case MAN: System.out.println(); break; case WOMAN: System.out.println(); break; } }
看起来这些貌似也没什么问题,但是我们知道,一个项目基本都是基于团队开发,或许只有你自己知道int类型的1代表gril,0代表Boy。其他同事看到这个函数根本不知道其中的含义,这样的代码很明显阅读性很差,从而会造成沟通成本很高。我们接着往下看,现在你为你的func写了很nice的注释,傻子都能看得懂(0
boy,1 gril)。但是项目组不可避免的总会出现那么一两个傻子,非要给你传个3进来,而且这样的错误编译器不会报任何错误,运行时会造成什么bug,这个只有乔老爷知道了。所以这样的代码是极不安全的。使用枚举就能很好的避免上面的问题,接下来我们就来理一理枚举的用法。
枚举用于存储数量有限的一组固定的数据集。使用场景:上面说到的性别的表示,一年四级春夏秋冬的表示,一周七天的表示,颜色的表示等等。
枚举的简单用法
// 普通枚举 public enum ColorEnum { white, red, green, blue; } /** * * 枚举中有一个自带的静态方法values(),返回enum实例的数据并且该数组中的元素顺序和声明时的顺序一样 * 枚举也可以像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法 */ public enum SeasonEnum { //注:枚举写在最前面,否则编译出错 spring, summer, autumn, winter; private final static String position = ; public static SeasonEnum getSeason() { if (.equals(position)) return spring; else return winter; } } /** * 带构造器的枚举 * 必须带有一个参构造器和一个属性跟方法,否则编译出错 * */ public enum Mode { PULLDOWN(), PULLUP(); private final String value; /** * 构造器默认也只能是private, 从而保证构造函数只能在内部使用 * */ private Mode(String value) { this.value = value; } public String getValue() { return value; } }
枚举中还有一个ordinal()方法返回一个int值,这是每个enum实例在声明时的次序,从0开始。枚举类还实现了Compareable接口,所以他具有compareTo()方法。同时还实现了Serializable接口,还自动为你提供了equals()和hashCode()方法。除了不能继承一个枚举类之外,我们基本上可以把枚举类当成一个常规的Java类,可以往其中添加新的方法,包括抽象方法甚至main方法。
现在我们用枚举来实现上面的那个性别函数
public enum EnumSex { MAN, WOMAN } public static void showSex(EnumSex EnumSex) { switch (EnumSex) { case MAN: System.out.println(); break; case WOMAN: System.out.println(); break; } } public static void main(String[] args) { showSex(EnumSex.MAN); // showSex(EnumSex.Renyao) 编译报错 }
这样既有很好的阅读性又避免的安全性问题
相关文章推荐
- Java基础学习总结(77)——Java枚举再总结
- JAVA基础学习总结及注意事项
- Java基础学习总结
- 黑马程序员———java视频一到四天的基础视频学习总结
- java枚举学习总结
- 黑马程序员__关于学习Java基础加强的总结_1
- java多线程学习总结之一:基础原理
- JAVA基础学习总结---原码、补码、反码以及基本数据类型
- java基础知识学习与总结(一)
- JAVA基础学习--IO流总结<一>
- java基础----面向对象5(关键字的总结学习)
- JAVA学习小总结(稍有基础的人就不要看了)
- 黑马程序员_java基础知识学习总结一
- JAVA基础语法学习总结
- 基础入门:关于JavaIO流学习总结
- JAVA学习小总结(稍有基础的人就不要看了)
- 黑马程序员_java基础知识学习总结三
- 黑马程序员_java基础知识学习总结四
- java线程之基础学习总结(二)
- 工作学习 问题总结 java 基础 关于arraylist.addall