目录

一、为何引入枚举类型(为了替代魔法值)

什么是魔法值?魔法值有哪些隐患,见另一篇文章编码规约之使用Enum枚举类替代魔法值

那么为什么不用静态变量来替换魔法值呢?

有时候,变量的取值只在一个有限的集合内。例如一年中只有春、夏、秋、冬四季,销售服装只有小、中、大、特大四种尺寸。当然,可以将这些尺寸分别编码为1、2、3、4或者S、M、L、X。可能,我们有疑问,为何不用静态全局常量来替代呢?以一年四季为例

public static final int SEASON_SPRING = 1;

public static final int SEASON_SUMMER = 2;

public static final int SEASON_FALL = 3;

public static final int SEASON_WINTER = 4;

但是这样存在着一定的隐患

1.静态常量类型不安全

若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。

currentSeason.setSeason(需要传入一个整型参数,即季节编码);

currentSeason.setSeason(SEASON_SPRING);//传入春季整型编码

//那既然setSeason接收一个整型数据,那么我就可以向其传入其他整型数据

currentSeason.setSeason(0);

//那么此处的0,又代表什么呢?

2. 没有命名空间

开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代表季节。

二、枚举类型初识

先看一个简单的枚举类

public enum SeasonEnum {

SPRING,SUMMER,FALL,WINTER;

}

1.enum和class、interface的地位一样

2.比较同一枚举类中不同值直接= =

因为枚举类型的值是固定的,不需要发生改变,在比较两个不同值时可以直接使用"= ="就可以了

3.默认继承了java.lang.Enum

enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。但是,Enum是继承了Object类。枚举类可以实现一个或多个接口

4.所有实例都必须放在第一行展示

枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。

5.不可以被继承

使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承

6.构造器只能是私有的

因为枚举类型的值是固定的,不需要发生改变,因此枚举被设计成是单例模式。即枚举类型会由JVM在加载的时候,实例化枚举对象,你在枚举类中定义了多少个就会实例化多少个,JVM为了保证每一个枚举类元素的唯一实例,是不会允许外部进行new的,所以会把构造函数设计成private,防止用户生成实例,破坏唯一性。

三、枚举类添加属性和构造器

枚举类内也可以定义属性和方法,可是是静态的和非静态的。但是,构造器一定是私有的,前面已经说过了,枚举类型被设计成了单例模式。构造器需定义成私有的,这样就不能在别处申明此类的对象了。它的Field不应该被改变,这样会更安全,而且代码更加简洁。所以我们将Field用private final修饰。

实际上在第一行写枚举类实例的时候,默认是调用了构造器,所以此处需要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。

public enum SeasonEnum {

SPRING("1","春天"),SUMMER("2","夏天"),FALL("3","秋天"),WINTER("4","冬天");

private final int code;

private final String name;

private SeasonEnum(int code,String name)

{

this.code= code;

this.name = name;

}

public String getName() {

return name;

}

public String getCode() {

return code;

}

}

四、枚举类实现接口

枚举类可以实现一个或多个接口。与普通类一样,实现接口的时候需要实现接口中定义的所有方法,若没有完全实现,那这个枚举类就是抽象的,只是不需显式加上abstract修饰,系统化会默认加上。

public enum Operation {

PLUS{

@Override

public double eval(double x, double y) {

return x + y;

}

},

MINUS{

@Override

public double eval(double x, double y) {

return x - y;

}

},

TIMES{

@Override

public double eval(double x, double y) {

return x * y;

}

},

DIVIDE{

@Override

public double eval(double x, double y) {

return x / y;

}

};

/**

* 抽象方法,由不同的枚举值提供不同的实现。

* @param x

* @param y

* @return

*/

public abstract double eval(double x, double y);

}

五、其他API

1. 返回指定名称和指定类的某个枚举类

static Enum valueOf(Class enumClass, String name)

2.返回枚举常量名

String toString()

3.返回枚举常量的序数

int ordinal()

4.返回枚举的所有值

static T[] values()

标签:Java,int,double,final,枚举,return,public

来源: https://blog.csdn.net/mmake1994/article/details/88683017

java枚举类型季节实例_Java之枚举类相关推荐

  1. java枚举类型enum用法_java枚举类型enum用法和原理介绍【传智播客】

    Enum枚举类型 Enum的全写是Enumeration,这个词的翻译是列举.逐条陈述.细目.在程序语言中,枚举类型是一种特殊的数据类型(常用的数据类型比如字符串.整型),这种数据类型的变量值限定在固 ...

  2. java枚举类构造方法默认是,枚举类型的构造方法_Java语言程

    枚举类型的构造方法_Java语言程 6.6.4 枚举类型的构造方法 枚举类型既然是类,那么就可以有构造方法.只不过只能是私有的(private),不能有公有的(public)构造方法,这是为了避免直接 ...

  3. 枚举类型enum用法_Java枚举深度解读,看这篇就够了

    作者 | 涛GuoGuo的跟屁虫丶博Ke 来源 | urlify.cn/aaamQf 66套java从入门到精通实战课程分享 Java枚举 1.枚举类概念的理解与定义 一个类的对象是有限个,确定的,我 ...

  4. Java--枚举类型(枚举类型介绍 定义枚举类型 枚举类型的使用 枚举类型的注意事项 遍历枚举项)

    01: Java–枚举类型(枚举类型介绍 & 定义枚举类型 & 枚举类型的使用 & 枚举类型的注意事项 & 遍历枚举项) 02: Java–枚举类型(枚举类型实现接口 ...

  5. 编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素...

    建议130:以复数命名枚举类型,以单数命名枚举元素 枚举类型应该具有负数形式,它表达的是将一组相关元素组合起来的语义.比如: enum Week{Monday,Tuesday,Wednesday,Th ...

  6. php枚举属于什么类型,python枚举类型是什么?python枚举类型的简单介绍

    本篇文章给大家带来的内容是关于python枚举类型是什么?python枚举类型的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:枚举类型的定义 二:枚举类和普通类的区别 ...

  7. 在java中关于枚举类型的特性_java枚举类型小结

    JDK5.0之前,我们一般选择使用 interface 来保存常量组,以此来弥补 JDK 中没有枚举类型的缺陷,从JDK5.0开始,Sun引进了一个全新的关键字 enum 来定义一个枚举类.同inte ...

  8. java 枚举类型 取值_java枚举类型

    一: 有时候变量的取值是在有限的集合内,比如说服务器状态:上线.下线.报废等. 可以将这些装备标记为:1.2.3 但是这种情况,我们在给变量赋值的有时候赋值为错误的值比如:0 或者true 这时候就出 ...

  9. java枚举类型enum用法_Java枚举类型——Enum的简单用法

    枚举类型是Java1.5的新特性,是指由一组固定的常量组成合法的类型.Java中由关键字enum来定义一个枚举类型.我们可以使用枚举来取代用public final static修饰的一批相关数据.如 ...

最新文章

  1. misc高阶 攻防世界_攻防世界 Misc 进阶题(一)
  2. 大剑无锋之post那么多优点,为什么还用get
  3. [css] css如何消除字体的锯齿?
  4. match和exec的对比
  5. python中的数据成员有两类_Python类和对象
  6. Windows下载FFmpeg最新版(踩了一上午的坑终于成功)
  7. 《数据结构题集》习题解析
  8. java调用win32_java调用win32api操作windows窗口
  9. IDM 扩展安装版本冲突解决(Chrome尝试对扩展程序进行降级处理)
  10. 第一节课 opencv图像处理,对图片进行叠加处理
  11. TD阵营折大将 芯片商凯明将面临倒闭[转]
  12. 使用 Kubernetes Ingress 对外暴露服务
  13. 玩了下朋友刚买的iphone4s,太鸡冻了,太幸福了
  14. 全球5G市场最新进展及未来展望
  15. 从一个CFS调度案例谈Linux系统卡顿的根源
  16. 2022最新云存储网盘系统/文件分享存储系统
  17. 雅思阅读真经总纲_想提高雅思阅读?这是你一定要知道的8本书
  18. 6 Babylonjs基础入门 光源
  19. SocketTools库版,资源重定向的处理
  20. Flink Watermark相关概念(窗口、水位线、迟到事件)

热门文章

  1. 基于SPI协议的Flash驱动控制-数据普通读操作
  2. 二进制,CPU,操作系统
  3. MCS51单片机的输入/输出接口应用
  4. 简单理解云桌面的模板,桌面池和虚拟机的概念
  5. 初识C语言 | C语言零基础入门(第一天)
  6. bat命令实现游戏存档自动备份
  7. Android ImageView: resolveUri failed on bad bitmap uri
  8. 朴素贝叶斯(西瓜数据集分类,社区恶意留言分类,垃圾邮件分类,新浪新闻分类),AODE分类器 代码实现
  9. 遥感图像处理:最小噪声分离变换(Minimum Noise Fraction Rotation,MNF Rotation)
  10. 如何将零碎信息结构化并做到有序安放,以实现知识积累?