Java注解参数类型枚举值_EffectiveJava-5-枚举和注解

用enum代替int常量

1. int枚举:

引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。

int枚举模式是类型不安全的,例如下面两组常量:性别和动物种类,二者不存在任何关系,然而却可以将ANIMAL_DOG传入一个需要性别参数的方法中,编译器不会出现警告,而且方法内部逻辑还会继续执行比较等操作。

d12ae0f94022

采用int枚举模式的程序是十分脆弱的,因为int枚举是编译时常量,被编译到使用它们的客户端中,如果与枚举常量关联的int值发生变化客户端就必须重新编译,然而不重新编译却不会报错,但是会导致程序的结果不准确,例如上面的常量SEX_MAN被客户端使用,于是将其值1编译到客户端的.class中,然后如果API类中将SEX_MAN的值改为2,却不重新编译客户端,那么客户端得到的结果就是不准确的了。

int枚举常量很难被翻译成可打印的字符串,不利于开发调试。

开发过程中还可能遇到这种模式的变体,如String枚举模式,同样是存在上述问题。

2. 枚举类型:

由一组固定的常量组成的合法值的类型,例如:

d12ae0f94022

实现思路:通过公有静态的final域为每个枚举常量导出实例的类。

枚举类型是类型安全的枚举模式,而且完善类int枚举模式的不足。

枚举类型还允许添加任意的方法和域,并实现任意的接口,它提供类所以Object方法的高级实现,实现了Comparable和Serializable接口,并针对枚举类型的可任意改变性设计了序列化方式。

d12ae0f94022

特定于常量的方法实现:

在枚举类型中声明一个抽象方法,并在特定于常量的类主体中,用具体的方法覆盖每个常量的抽象方法。例如下面这样定义一个代表加减乘除等运算符的枚举。

d12ae0f94022

策略枚举:多个枚举常量同时共享相同的行为时,考虑使用策略枚举。

例如下面这样:

d12ae0f94022

用实例域代替序数

序数:枚举天生就与一个单独的int值相关联,所有枚举都有一个ordinal()方法,返回每个枚举常量在类型中的数字位置(类似于数组索引)。

永远不要根据枚举的序数导出与他相关联的值,而是将它保存在一个实例域中 (Enum规范中关于ordinal()写到:"大多数程序员都不需要这个方法,它是设计成用于像EnumSet,EnumMap这种基于枚举的通用数据结构的)。

d12ae0f94022

用EnumSet代替位域

位域:可以用or(|)位运算将几个常量合并到一个集合中,例如下面代码这样:

d12ae0f94022

位域的不足:具有int枚举的所有缺点

替代方案--EnumSet:从单个枚举类型中提取多个值,每个EnumSet内容都表示为位矢量, 如果底层的枚举类型有64或更少的元素(大多如此),整个EnumSet就是用单个long来表示, 因此,它的性能比得上位域的性能

d12ae0f94022

用EnumMap代替序数索引

使用序数索引ordinal的场景:

d12ae0f94022

上面代码实现了对花园中对植物进行分类,然而存在许多问题:

1.数组不能与泛型兼容,需要进行未受检对转换;

2.set数组并不知道每个索引set的set代表什么;

3. 之前有提到不推荐使用ordinal;

解决方案:EnumMap

d12ae0f94022

用接口模拟可伸缩的枚举:

虽然无法编写可扩展的枚举类型,却可以通过编写接口以及实现该接口的基础枚举类型,对它进行模拟,这样允许客户端编写自己的枚举来实现接口;如果API是根据接口编写的,那么在使用基础枚举类型的任何地方,也都可以使用这些枚举。例如下面代码,还是用之前的算数运算符举例:(但是这样还是有些不足,就是无法实现从一个枚举类型继承到另一个枚举类型,代码少的当然可以直接复制粘贴, 如果功能比较多则可以将他们封装在一个辅助类或静态辅助方法中,避免代码的复制工作)。

d12ae0f94022

d12ae0f94022

注解优先于命名模式

- 命名模式:有些程序元素需要通过某种工具或框架进行特殊处理

例1:JUnit测试框架原本要求用户一定要用test作为测试方法名的开头

例2:iOS中的init方法要求必须是initXXX()

- 命名模式缺陷:

1. 文字拼写错误会导致失败,且没有任何提示,造成错误的安全感,如JUnit的测试方法testXX写成textXX或tsetXX等

2. 无法确保他们只用于相应的程序元素,如JUnit的命名只对方法生效,将某个类命名testXX是无效的,不会报错,但不会执行测试

3. 没有提供将参数值与程序元素关联起来的好方法,如JUnit想增加一种测试类别,只在抛出某种特定异常时才会成功, 而这个异常类型需要用户通过参数进行自定义,这种实现通过命名模式实现(将异常类型编写到方法名中)并不理想。

注解对上面问题的解决,请看下面代码:

d12ae0f94022

坚持使用Override注解

应该在想要覆盖超类声明的每个方法声明中使用Override注解 例如我们经常会重写自定义模型类的equals方法,下面用代码说明使用Override注解的优势。

d12ae0f94022

使用Override还有一点好处,就是可以区分哪些方法是超类对,哪些方法子类扩展对

用标记接口定义类型

标记接口:没有方法声明,只是表示具有某种属性,如Serializable接口

标记接口的优点 :

1. 标记接口定义的类型是由被标记类的实例实现的,标记注解则没有这样的类型

2. 标记接口可以更加精确的被锁定,可以是对其他接口的扩展,也可以被其他标记接口扩展,如Collection和Set

标记注解的优点:1. 可以通过默认方式添加一个或多个注解类型的元素,给已被使用的注解类型添加更多的信息,方便扩展

2. 另一个优点在于它们是更大的注解机制的一部分,因此,标记注解,在那些支持注解作为编程元素之一的框架中同样具有一致性

如何选择?

- 如果标记是应用到任何程序元素而不只是类或接口,那就必须使用注解

- 如果只是用于类或接口,需要考虑要编写只接受有这种标记的方法,使用接口作为相关方法的参数类型, 可以提供编译时就进行类型检查的好处

- 是否要永远限制这个标记只用于特殊接口的元素,如果是,最好将标记定义成该接口的一个子接口

我是今阳,如果想要进阶和了解更多的干货,欢迎关注公众号”今阳说“接收我的最新文章

d12ae0f94022

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

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

相关文章

【渝粤教育】国家开放大学2018年春季 0149-21T现代汉语 参考试题

试卷编号:0149 座位号 2017——2018学年度第二学期期末考试 现代汉语试题 2018年7月 1.合口呼韵母2.合成词 3.同义词4.非成词语素 5.派生义 1.有两种趋势促进了现代汉民族共同语的发展,一是 …

JDK 12 – JEP 325开关表达式

JDK 12于2019年3月19 日上线GA,继续致力于缩短发布周期和频繁发布。 该版本的功能部分可以在这里找到。 对于开发人员来说,有趣的功能之一是“ JEP 325开关表达式 ”,它可以作为预览功能使用。 此处定义的预览功能是: 预览语言或…

【渝粤教育】国家开放大学2018年春季 0222-22T模拟电子电路 参考试题

编号:0222 b 2017-2018年度第二学期期末考试 模拟电子电路(开卷) 试 题 2018年 7 月 一 、概念解释(每小题6分,共30分)1、电流放大倍数2、自激振荡3、负反馈4、通频带5、滤波二、放大电路的计算&#xff0…

工业交换机:如果出现了物理性故障该怎么判断?

一般工业交换机出现故障大致可以分为:软性能故障和物理性故障。软性能故障一般是指工业交换机在研发设计方面出现的问题。今天就由飞畅科技的小编来给大家聊聊工业交换机物理性故障该怎么判断?一起来看看吧! 物理层故障主要是指交换机本身的…

java example cat_java maven hello example

Maven插件开发From:Maven 插件开发—-让maven使用更加灵活对于习惯于使用maven构建、管理项目的人来说,maven就是项目开发、测试、部署的一把利器:对类库的集中管理;依赖传递、继承、重用性高;对整个项目开发生命周期的完整支持&a…

【渝粤教育】国家开放大学2018年春季 0283-21T广告创意与表现(二) 参考试题

试卷代号:0283 2017-2018年度第2学期期末考试 广告创意与表现(二)试题(闭卷) 2018年5月 请指出下列作品采用的基本广告创意思路,并结合作品对此创意思路的定义、广告效果、思路进行阐述。字数不低于400。&…

工业交换机常用术语及常见知识点汇总

工业交换机作为现在最流行也最高效率的数据通信设备,它本身就是一款高科技产品。是产品就有很多的参数和指标,很多采购的朋友,可能只是按照公司的要求来进行筛选对应的产品,对工业交换机的了解不是很深入,甚至对交换机…

java lambda 调用函数_Java lambda函数将如何编译?

VM决定如何实现lambda,而不是编译器。请参阅Lambda表达式的翻译中的for部分。我们没有描述生成用于实现lambda表达式的对象的字节码(例如,调用内部类的构造函数),而是描述了构造lambda的方法,并将实际构造委托给语言运行时。 该配…

【渝粤教育】国家开放大学2018年春季 0632-22T老年保健按摩 参考试题

科目编号:0632 座位号 2017-2018学年度第二学期期末考试 老年保健按摩试题 2018年7月 一、名词解释(本大题共5小题,每小题4分,共计20分) 1.老年病: 2.耳穴疗法: 3.拔罐疗法: 4.刮…

q7goodies事例_Java 8 Friday Goodies:精益并发

q7goodies事例在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个…

【渝粤教育】国家开放大学2018年春季 0700-22T中级会计实务(一) 参考试题

科目编号:0700 座位号 2017-2018学年度第二学期期末考试 中级会计实务(一) 试题 2018年 7 月 一、单选题(本大题共10小题,每小题3分,共计30分) (★请考生务必将答案填入到下面对应序…

工业交换机的外壳设计重要吗?

工业交换机一般使用在环境比较恶劣的地方,例如工厂等,为了让工业交换机更好的使用,工业交换机的外壳设计起到至关重要的作用,工业交换机的外壳可以更好的保护工业交换机的使用,那么如何才能选到实用的工业交换机外壳呢…

java 邮件 超链接_将Excel范围中的超链接传输到Outlook电子邮件

我正在尝试从excel范围(rng 1到6)创建一个电子邮件,其中包含A列和D列中每个单元格的超链接 . 以下是为这些范围创建超链接的代码示例 . 一切正常 .ActiveSheet.Hyperlinks.Add Anchor:ActiveWorkbook.Sheets("Overdue").Range("A" & D2), _…

【渝粤教育】国家开放大学2018年春季 3818-22T燃气工程施工 参考试题

科目编号:3818 座位号 2017-2018学年度第二学期期末考试 燃气工程施工 试题 2018年 7 月 一、填空题(本大题共10空,每空3分,共计30分) 1.常用沟槽断面有___________________、、、联合槽四种形式。 2&…

【渝粤教育】国家开放大学2018年春季 7140-22T危急重症护理学(本) 参考试题

编号:7140 座位号 2017~2018学年度第二学期期末考试 危急重症护理学试题 2018年07月 一、名词解释(每题5分,共20分) 甲状腺危象 中毒 心肺脑复苏 惊厥 二、填空 (每空3分,共30分&#xff…

工业交换机和工业4G路由器的区分

工业交换机也称作工业以太网交换机,即应用于工业控制领域的以太网交换机设备,由于采用的网络标准,其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议,以太网已经成为工业控制领域的主要通信标准。工业交换机具有…

java 包装类方法总结_【源码】java包装类总结

1.包装类除了Void和Character,其他六个全部都继承自Number。Number是一个抽象类。如下:public abstract class Number implements java.io.Serializable {public abstract int intValue();public abstract long longValue();public abstract float float…

扩展枚举功能的两种方法

前言 在上一篇文章中,我解释了如何以及为什么在Java代码中使用enums而不是switch/case控制结构。 在这里,我将展示如何扩展现有enums功能。 介绍 Java enum是一种编译器魔术。 在字节码中,任何enum都表示为扩展抽象类java.lang.Enum并具有几…

【渝粤教育】国家开放大学2018年春季 7403-21T素质与思想政治教育 参考试题

编码:7403 座位号: 2017-2018学年度第二学期期末考试 素质与思想政治教育试题(开卷) 2018年7月 一、单项选择题(每题3分,共30分) 考生注意:请将答案填写在下面的方框内,…

工业交换机和工业级光纤收发器的区别

工业交换机和工业级光纤收发器都是网络数据传输设备中的重要组成部分。工业交换机是进行网络内数据交换的一种以太网连接设备,而工业级光纤收发器是延长传输距离的一种光电转换设备。那么他们之间具体有哪些不同之处呢?接下来就由飞畅科技的小编来为大家…