java枚举的特点_Java中有些好的特性(二):枚举

前言

我在写上一篇时,开始选了一个很土的名字“Java超过C#的地方”,然后引起了某些同学的不满,后来修改了个名。我在这里再次申明一下,我没有贬低任何语言之意,纯粹是从一个.NET程序员的角度去看Java,看看是不是有些什么在开发中觉得比较“爽”的东西。务必请用专业的态度来比较各种技术的长短。

Java的枚举是一个“class”

Java的早期版本时没有enum的,大家都用interface里加常量的方式实现,Java 1.5版本之后添加了对enum的支持。

Java认为类C的枚举不是类型安全的(type safe),所以Java中没有枚举,Java的枚举就是类(Enum Class),只是用了一个enum代替class而已(虽然.NET里在MSIL层面枚举最终也是一种“class”)。因为Java的枚举是类,所以就带来一些与C#中的枚举有趣的不同点,比如可以添加方法,可以添加属性。请看下面的Java代码:

1: public enum Role{

2: Admin("管理员"),

3: Owner("所有者"),

4: Creator("创建者");

5:

6: private String displayName;

7:

8: Role(String displayName){

9: this.displayName = displayName;

10: }

11:

12: public String getDisplayName(){

13: return this.displayName;

14: }

15: }

Java的枚举居然可以这么写!枚举里可以有方法。这里的Admin,Owner,Creator实际上是Role类的常量,调用Role(String)构造器,但是Java不允许你将enum的构造器设为public,由Java自己内部调用。

有人可能会问这样有什么用处呢?比如上面这段代码,建一个枚举表示系统中的所有角色,为了用户友好性,数据库里我们保存角色名字,但是在系统界面上我们要显示一个更具描述性的名字,而且假如我们的系统需要多语言化,那么在不同的语言平台上的界面上我们的系统应该显示不同的描述性短语(注意:.NET中的枚举是不能国际化的),比如下面的界面:

1d5985a25dcb3f0980fd244b14f9808b.png

3596daf32bec78b4f28e8095d4d61de8.png

那我们就可以这样做:

1: public enum Role{

2: Admin("role-admin"),

3: Owner("role-owner"),

4: Creator("role-creator");

5:

6: private String displayName;

7:

8: Role(String displayName){

9: this.displayName = displayName;

10: }

11:

12: public String getDisplayName(){

13: return Resource.get(this.displayName);

14: }

15: }

我们这里getDisplayName的时候调用一个国际化的API,通过枚举构造器里传入的参数作为key获取国际化的表示。

Java的enum是类型安全、版本安全的

这样一说好像C#的enum不是类型安全的一样,哼!嗯,某种角度上来说C#(本文以C#指代整个.NET平台)的枚举真的不是类型安全的。比如下面的代码:

1: using System;

2: public enum Role:short

3: {

4: Admin,Owner,Creator

5: }

6:

7: public class Program

8: {

9: public static void Main(String[] args)

10: {

11: byte i = (byte)Role.Owner;

12: }

13: }

即使我们给C#的enum指定了underlying type,但是我们还是可以将其任意的与基本类型进行转换。而且这种转换是静悄悄地进行的,编译器和运行时都不会提醒我们。

C#的enum完全是一个常量,所以跟C#的const一样还会带来版本的问题。比如A程序集定义了一个枚举Role,B程序集引用A程序集,使用Role,实际上在运行时B程序集不再需要A程序集了(大家知道什么原因吧)。这样如果A程序集修改了Role,比如修改了枚举常量的顺序:从Admin,Owner,Creator变为Admin,Creator,Owner。而B程序集没有重新编译,这个时候就会出现问题。

C#中实现Enum class

实际上Enum Class是一种模式,只是java的enum将这种模式放到了语言中,我们在C#里一样可以实现:

1: public sealed Class Role

2: {

3: public static readonly Role Admin = new Role("role-admin");

4: public static readonly Role Owner = new Role("role-owner");

5: public static readonly Role Creator = new Creator("role-creator");

6:

7: private String displayName;

8:

9: private Role(String displayName)

10: {

11: this.displayName = displayName;

12: }

13:

14: public String DisplayName

15: {

16: get

17: {

18: Resource.Get(this.displayName);

19: }

20: }

21: }

只是实现起来比java的默认实现繁琐一点而已,毕竟那是人家语言的first class。

位标记

如果在C#的enum上添加[Flags]的特性话,这个enum就不再是enum了,就变成了位标记。位标记这东西在实现某些功能时确实非常滴方便,比如一个文件的属性:只读,只写,可读写,比如权限控制系统等等。Java的枚举就不能添加这么一个annotation了,不过Java有个EnumSet,我们借助这个API实现位标记同样的功能。

后记

Java的enum与C#的enum各有特色,Java的enum更灵活一些,C#的enum更轻型一些,但是使用时请注意C#的enum的一些问题。

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

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

相关文章

java开发一款推箱子游戏

导读:社会在进步,人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。此次设计符合了社会需求,Java推箱子游戏可以让人们在闲暇之余,体验游戏的乐趣。具有操作简单,易于上手的特点。 推箱子游戏的玩法十分简单——控制人物绕…

java ee技术_Java EE 6与Spring Framework:技术决策过程

java ee技术在过去的几个月中,我们经历了这个决策过程:为Java平台上的企业开发选择哪种技术堆栈? 有多种选择。 但是,我们深入讨论的是:纯Java EE 6堆栈与带有Java EE的Spring。 以下博客文章总结了当您考虑这些技术堆…

java获取系统当前时间格式化_java 获取系统当前时间并格式化

java 获取系统当前时间并格式化CreateTime--2018年5月9日11:41:00Author:Marydon实现方式有三种updateTime--2018年7月23日09点32分准备工作:import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;方式一:/*** 获取系统当…

并行和并发

并行:同时运行,从微观的角度讲 并发:同时发生,从宏观的角度讲 并行是真正意义上的同时执行。而并发不是。 “并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。 而“并发…

java 本地方法栈_Java虚拟机栈和本地方法栈

Java虚拟机栈的特征线程私有后进先出(LIFO)栈存储栈帧,支持Java方法的调用、执行和退出可能出现OutOfMemoryError异常和StackOverflowError异常Java本地方法栈的特征线程私有后进先出(LIFO)栈作用是支撑Native方法的调用、执行和退出可能出现OutOfMemoryError异常和…

如何使用Java,Maven,Jetty创建Web应用程序项目

在本文中,我们使用Maven Archetype插件创建一个简单的Web应用程序。 我们将在名为Jetty的Servlet容器中运行此Web应用程序,添加一些依赖项,编写简单的Servlet,并生成WAR文件。 在本文的最后,您还可以在Tomcat中部署该服…

java开发一款坦克大战游戏

导读:随着人们对生活质量的要求一天比一天高,为了让人们更好地开掘自身的智慧,游戏就此进入了大众的视野,在人们的生活中有着重要的位置,已然变得必不可少。游戏产业推动高新技术不断升级,极大地促进了经济的增长,推动了“第四产业”的经济腾飞。坦克大战游戏是童年时期…

java大转盘抽奖概率算法_幸运大转盘抽奖 抽奖算法 程序实现逻辑

近期碰到的一个需求,实现一个类似大转盘抽奖的功能,需自定义奖项,各奖项中奖概率,当日抽奖最大次数,抽奖成本等。分享一个简单的java代码的实现的思路,有不足之处感谢各位指正。初步方法首先要定义几个奖品…

java开发银行柜员业务绩效考核系统

导读:当今社会己进入信息社会时代,信息己经受到社会的广泛关注,被看作社会和科学技术发展的三大支柱(材料、能源、信息)之一。信息是管理的基础,是进行决策的的基本依据。在一个组织里,信息己作为人力、物力、财力之外的第四种能源,占有重要的地位。然而,信息是一种非…

mysql orderby count_mysql中count(),groupby,orderby使用方法分享

本文主要和大家分享mysql中count(), group by, order by使用方法,mysql中order by 排序查询、asc升序、desc降序,group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询…

一文教你使用java开发一款坦克大战游戏

导读:随着人们对生活质量的要求一天比一天高,为了让人们更好地开掘自身的智慧,游戏就此进入了大众的视野,在人们的生活中有着重要的位置,已然变得必不可少。游戏产业推动高新技术不断升级,极大地促进了经济…

Java 8流中的常见SQL子句及其等效项

功能编程允许使用通用语言进行准声明性编程 。 通过使用功能强大的流畅API(例如Java 8的Stream API )或jOOλ的顺序Stream扩展Seq或更复杂的库(例如javaslang或functionaljava) ,我们可以以一种非常简洁的方式来表示数…

php开启openssl的方法

windows下开启方法: 1: 首先检查php.ini中;extensionphp_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘;’, 如果不存在这行,那么添加extensionphp_openssl.dll。 2: 讲php文…

mysql 短时大连接的问题_mysql长连接和短连接的问题

什么是长连接?其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。通常的短连接操作步骤是:连接-》数据传输-》关闭连接;而长连接通常就是:连接-》数据传输-》保持连接-》数据传输-》保…

java实现动漫论坛

导读:作为文化产业的一部分,动漫影响了我国一代又一代青少年,据钱江晚报调查显示,有超过七成的95后愿意从事与动漫相关的行业,可见其对青少年影响力之大。 动漫论坛作为最先开始热爱动漫人士进行交流的方式之一,是爱好者们共享信息,寻找同伴的重要渠道之一。在这次毕业设…

混合使用Azure LB和ILB访问相同web服务(3)

接下来我们来配置Azure Load balancer,就是面向公网的负载均衡器: 1.在该测试中,为了保持内网访问和外网访问一样的体验,本地端口和public端口和ILB一样,同样是80: PS C:\> Get-AzureVM -ServiceName …

Java实现个人博客系统(附下载源码)

导读:进入二十一世纪,以Internet为核心的现代网络积水和通信技术已经得到了飞速的发展和广泛的应用,各种网络交流互动工具也应运而生。其中以论坛、博客、社区、空间最为受广大网民朋友的欢迎,也是目前为止发展的比较成熟的信息交流工具。在网络技术逐渐渗入社会生活各个层…

mysql日活统计函数_如何通过简化日活模型,预估一个产品的日活(DAU)?

本文笔者通过简化日活模型,粗略地估算出未来一段时间的产品日活规模。进而通过日活的规模,再去估算一些潜在收益,以及运营成本等等数据。这段时间,经常有人问到以下的问题:按照现在的推广和留存,我们在未来…

通过SPANN方式将Spring&Quartz与自定义注释集成

在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业。 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中。 批注定义了作业的名称,组及其cron表达式。 后来,大部分代码专用于处理该批注&#xf…

Linux学习之常用技巧

▌基础 学习 Bash 。你可以man bash来看看bash的东西,并不复杂也并不长。你用别的shell也行,但是bash是很强大的并且也是系统默认的。(学习zsh或tsch只会让你在很多情况下受到限制) 学习 vim 。在Linux下,基本没有什么…