java enum优点_你需要关注的 Java Enum 枚举的几个细节

枚举是一个非常古老的语言特性,用来实现具名的有限集合,在 C/C++ 中使用广泛。而 Java 在 Java SE5 才引入枚举。也许语言设计者觉得既然是后引入该特性,那么一定要在这个特性上支持比其他语言更多的特性。这些特性的确让 Java 的枚举功能看起来更加“成熟”,同时也引入了一些复杂性,需要开发者关注。

枚举是一个不能继承的常规类

定义一个一周七天的枚举类型:

public enum EnumWeekDay {

Mon, Tue, Wed, Thu, Fri, Sat, Sun;

}

编译成 class 文件后反编译查看:

╰─➤ javap EnumWeekDay

Compiled from "EnumWeekDay.java"

public final class EnumWeekDay extends java.lang.Enum {

public static final EnumWeekDay Mon;

public static final EnumWeekDay Tue;

public static final EnumWeekDay Wed;

public static final EnumWeekDay Thu;

public static final EnumWeekDay Fri;

public static final EnumWeekDay Sat;

public static final EnumWeekDay Sun;

public static EnumWeekDay[] values();

public static EnumWeekDay valueOf(java.lang.String);

static {};

}

从反编译结果可知:枚举类型的关键字 enum 其实只是一个语法糖,编译器最终把它转化为一个final类,因此枚举是不可继承的。

枚举的每一个取值被编译器传化为了一个个 static final 属性。

本质上,这就是一个普通类,因此你可以在枚举是添加各种方法,甚至是main方法。

神奇的 values() 方法

从上面我们可以看出枚举类型被添加了一个静态的 values() 方法,但是 java.lang.Enum 并没有该方法。其实,这个方法是编译器添加的。通过这个方法可以获取到该枚举类型的所有取值。这个方法在需要遍历枚举取值,进行判断筛选的场景非常有用,可参考下例的 getByZhName 方法。

在枚举中保存其他信息

在 C 中,枚举可以简单的理解为具名的整型子集。Java 扩展了这个属性,使得可以在枚举中保存其他信息。

定义一个水果枚举类,并包含中文信息:

public enum EnumFruit {

APPLE("苹果"),

BANANA("香蕉"),

ORANGE("橘子");

private String zhName;

EnumFruit(String zhName) {

System.out.println("enum init:" + zhName);

this.zhName = zhName;

}

/**

* Getter method for property zhName.

*

* @return property value of zhName

*/

public String getZhName() {

return zhName;

}

public EnumFruit getByZhName(String zhName) {

for (EnumFruit fruit : values()) {

if (fruit.getZhName().equals(zhName)) {

return fruit;

}

}

return null;

}

}

使用这种方式定义枚举的方式需要注意:该枚举必须含有一个构造函数,且该构造函数必须是私有的。因为枚举就是常规类,而枚举对象就是具体的枚举实例,因此枚举有多少个取值,该构造函数就会被调用多少次:

public class EnumUser {

public static void main(String[] args) {

EnumFruit fruit = EnumFruit.APPLE;

System.out.println(fruit);

}

}

enum init:苹果

enum init:香蕉

enum init:橘子

APPLE

使用 EnumSet 和 EnumMap 提供性能

如果要在把枚举使用在 Set、Map 等集合场景,请使用 EnumSet 和 EnumMap。 EnumSet 使用了 bit vector 来标记元素,EnumMap 内部将 Map 实现简化为了数组,因此可以获得更好的性能。

小结

Java 的枚举语言特性作为一个后来者,的确带来了更加“成熟”和“丰富”的实现。但是,这些丰富的特性是否一定要在日常的项目中使用,我个人是不推荐的。就我个人理解,枚举最大的优点是类型和有限集合的约束,从而增强代码的一致性。因此,我提倡在项目代码中用 C 的枚举风格来使用 Java 枚举。此外,枚举并不是编程语言必须支持的特性,比如近段时间如日中天的 Golang 是不支持枚举的。既然是一个可有可无的语言特性,那就 use is as simple as possible 吧。

扩展阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量提取文件创建时间_不要眨眼!批量提取文件名,只需30秒

私信回复关键词【工具】~获取Excel高效小工具合集!让你的Excel效率开挂~众所周知,「复制粘贴」可以解决 Excel 中出现的大多数问题。那我们为什么还要学习 Excel 相关技巧???因为,「复制粘贴」费时费力呀&a…

C#Socket通信

概述所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议…

搜索引擎优化 SEO

搜索引擎优化(Search Engine Optimization,简称SEO)是一种利用搜索引擎的搜索规则来提高目的网站在有关搜索引擎内的排名的方式。由于不少研究发现,搜索引擎的用户往往只会留意搜索结果最前面的几个条目,所以不少网站都…

“妈,你当年咋看上我爸的?”网友晒爸妈结婚照,笑抽了!

全世界只有3.14 % 的人关注了爆炸吧知识最近看到网上有人问什么事情让你开始怀疑人生一网友回答看到我爹妈的结婚照我开始怀疑人生我怀疑我妈当时被我爸绑架了▼妈,有啥想不开的好好说或者你告诉我我爸到底是有什么特殊才艺吸引了你▼爸!我知道你娶到我妈…

【转】卖场开设社区便利店,不仅卖货,还有家政服务、售后衔接等(图)

台海网(微博)6月1日讯 (海峡导报记者 孙春燕/文 吴晓平/图)家门口开天虹便利店了,不仅有食品、水果,还有家政服务。  昨天,导报记者走访市场发现,厦门天虹第一家社区便利店“微喔”已于两周前悄然开业&am…

python求导函数的值_python怎么实现函数求导

python实现函数求导的方法是:1、利用sympy库中的symbols方法传入x和y变量;2、利用sympy库中的diff函数传入需要求导的函数即可返回求导之后的结果。python利用sympy库对某个函数求导,numpy库使用该求导结果计算的程序在python数据处理过程中&…

巴巴运动网学习笔记(16-20)

1.ProductType的JPA映射 View Code 1 Entity 2 public class ProductType { 3 private int id; 4 private String name; 5 private String note; 6 private boolean visible true; 7 private Set<ProductType> child; 8 private ProductType p…

监控主机安装需要材料

监控需要材料&#xff1a;方案一 没有监控录像机1.需要监控采集卡 &#xff08;可以用言者型号&#xff09;2.红外摄像机 &#xff08;监控距离10m---80m&#xff09;3.电源线视频线 &#xff08;可以用网线代替&#xff0c;用网线代替需要购买视频转Q9对接头&#xff09;…

批量生成 Gitee 仓库克隆命令的方法

当我们在一个新的公司入职或者发现一个很有意思的开源项目作者时&#xff0c;我们可能需要或者很想将该公司或作者的所有开源项目都克隆到本地慢慢研究。于是&#xff0c;笔者制作出了一段脚本可以一波将页面上的所有仓库生成克隆命令&#xff1a;var tmp []; $(.repository).…

Heartbeat+httpd+NFS 实现高可用的Web服务器

一、环境系统:CentOS 6.4x64位最小化安装nfs:192.168.3.31node1:192.168.3.32node2:192.168.3.33vip:192.168.3.34二、拓扑图三、前提条件1.节点之间主机名互相解析node1,node2:[rootheatbeat-node1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost…

在Marketplace上销售应用【WP7学习札记之十八】

Maketplace规则&#xff1a; ◇[1]Maketplace是唯一发布应用程序的地方&#xff1b; ◇[2]用户能在Maketplace上购买和部署应用程序&#xff1b; ◇[3]每个开发者可以解锁3台手机&#xff0c;这样开发者可以编写和部署应用程序到解锁的手机上。 销售应用程序&#xff1a; ◇[1]…

python时间函数报错_Python Day11-LEGB-global-时间函数

1.LEGB规则对变量名进行作用域解析我们已经知道了多个命名空间可以独立存在&#xff0c;而且可以在不同的层次上包含相同的变量名。“作用域”定义了Python在哪一个层次上查找某个“变量名”对应的对象。接下来的问题就是&#xff1a;“Python在查找‘名称-对象’映射时&#x…

java时间字符串比较大小_Java字符串转换为日期和时间比较大小

DateFormat fmt new SimpleDateFormat("yyyy-MM-dd");String dateBeginfmt.format(carrierCommand.getDateBegin());String dateEndfmt.format(carrierCommand.getDateEnd());//如果获得的日期格式不是2008-05-22,就必须要格式化一下日期String dateBegin request.…

VS2005混合编译ARM汇编代码

2019独角兽企业重金招聘Python工程师标准>>> 在开发过程中&#xff0c;发现简单的在Storage Memory区域拷贝或粘贴文件不能达到硬件量测的要求&#xff0c;需要直接通过编写ARM汇编指令让CPU直接对Memory进行读写数据。 以前没有用VS2005编写过汇编代码&#xff0c;…

中国最险六大寺庙,最后一座至今无人登临

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;「风景线」佛教远离尘世的特性使得很多寺庙修建于偏僻险要的山野&#xff0c;看似岌岌可危的建筑&#xff0c;却能屹立千百年而不倒&#xff0c;这不得不感叹古人智慧的伟大&#xff0c;这6大险要寺庙&#xff0c;绝对能…

c/c++ code JSON

cJSON 初体验 cJSON是一个超轻巧&#xff0c;携带方便&#xff0c;单文件&#xff0c;简单的可以作为ANSI-C标准的JSON解析器。官网地址 cJSON.c /*Copyright (c) 2009 Dave GamblePermission is hereby granted, free of charge, to any person obtaining a copyof this softw…

第五篇

C#中异常捕获如来完成: Try { 有可能出现错误的代码 } Catch { 写出现错误的代码; } ,-- 又称为自加1 和自减1 以前学的是一元运算符,而自加自减是一元运算符. Int age 18; Age age1; 用自加可写为: Int age 18; Age; Console.WriteLine(“age{0}”,age); 这种写法的效率比较…

Dapr牵手.NET学习笔记:发布-订阅

queue&#xff0c;是很好的削峰填谷工具&#xff0c;在业内也是主流&#xff1b;发布订阅&#xff0c;可以有效的解耦两个应用&#xff0c;所以dapr把他们进行了有效的封装&#xff0c;我们使用起来更简单高效。本篇的案例是下完订单后&#xff0c;会把消息发布到redis&#xf…

Java标签移动_如何使用基于鼠标单击的标签移动特定游戏对象?

我有一个由6个孩子的游戏对象组成的3D模型&#xff0c;我希望能够点击模型的每个部分并使该部分沿某个方向移动然后再次点击它然后返回到它原来的位置 . 我给每个零件都带了一个标签和一个盒子对撞机我打算让它们在我用碰撞器和不同的标签点击物体时移动 . 我看到光线投射有帮助…

sql年月日24小时制_Power Query 抓取气象台24小时降水量数据

我们借鉴之前抓取台风路径数据的例子&#xff0c;试一试抓取降水量数据&#xff1a;之前我们访问过这个网站&#xff0c;也试着抓取过数据&#xff0c;不过在谷歌浏览器中我们只能够找到两天的数据&#xff0c;但是通过台风路径数据抓取&#xff0c;我们猜想只要我们向服务器提…