《Effective Java》第6章 枚举与注解

独立游戏开发者的新武器:实测腾讯混元3D自动绑骨,搭配Mixamo让角色动画制作效率翻倍 本文实测腾讯混元3D自动绑骨功能与Mixamo动画库的协同使用,显著提升独立游戏开发者的角色动画制作效率。通过解决卡通角色绑骨偏差、优化骨骼权重及动画状态机配置,使原本两周的流程缩短至三天,并分享Unity中的性能优化与版权合规要点。 阅读详情

Jdk 1.5发行版本新增了两个引用类型家族:一种新的类称作枚举类型(enum);另一种新的接口称作注解类型(annotation type)

  1. 用枚举代替int常量【Item 30】
    1)枚举类型是指由一组固定的常量组成合法值的类型,如一年中的季节,一副牌的花色,一星期中的每天名称等
    2)int枚举模式是指声明一组具名的int常量,每个类型成员一个常量,而int枚举是编译时常量,会被编译到它们的客户端中,如果与枚举常量关联的int发生了辩护,客户端就必须重新编译,否则运行时的行为是不确定的,且其打印结果是完全不知名的int值,可读性差
    3)String枚举模式是指声明一组具名的String常量,虽然增加了打印输出内容的可读性,但是这种常量会导致性能问题,因为它依赖于字符串的比较操作,更糟糕的是这种常量如果字符串常量中有拼写错误在编译时是无法发现的,到运行时会报错
    4)枚举类型解决了int/String枚举模式的缺点,并提供了一些强大的功能。Java枚举类型是通过公有的静态final域为每个枚举常量导出实例的类,因为没有可访问的构造器,枚举类型是真正的final,且枚举类型为类型安全的枚举模式,其提供了编译时的类型安全
    5)包含同名常量的多个枚举类型可以在一个系统中和平相处,因为每个类型都有自己的命名空间。如果增加或者重新排列了枚举类型中的常量,无需重新编译它的客户端代码,因为导出常量的域在枚举类型和它的客户端之间提供了一个隔离层,常量并没有被编译到客户端代码中,而是在ini枚举模式之中
    6)为了将数据与枚举常量关联起来,得声明实例域,并编写一个带有数据并将数据保存在域中的构造器,枚举天生不可变,因此所有域都应该为final的,并且尽量缩小可访问性
    7)所有枚举都有一个静态的values方法,按照声明的顺序返回它的值数组,可以用for-each来遍历枚举类型的枚举常量,;枚举类型中的枚举常量的toString方法返回每个枚举值的声明名称;枚举类型有一个自动产生的valuesOf(String)方法,它将常量的名字转变成为常量本身
    8)如果一个枚举类具有普遍适用性,它就应该成为一个顶层类;如果它只是被用在一个特定的顶层类中,它就应该成为该顶层类的一个成员类
    9)枚举类型中的常量都可以看做一个类,其可以有类构造方法,可以有类主体,也就是说可以有自身的长远方法以及域等
    10)特定于常量的方法实现是指在枚举类型中声明一个抽象方法,并在特定于常量的类主体中用具体的方法覆盖该抽象方法,这样就为每个常量增加了特定的行为。且枚举类型中的所有常量必须在其类主体中覆盖枚举类型中的抽象方法,类似与策略模式,每个常量中的具体方法实现是一种策略
    11)在枚举类型中覆盖了toString方法,考虑增加一个fromString方法讲定制的字符串变回相应的枚举
    12)枚举中的switch语句适合于给外部的枚举类型增加特定于常量的行为,并不适合于在枚举中实现特定于常量的行为
    13)枚举会优先使用comparable而非int常量,与int常量相比,枚举有个小小的性能缺点,即装载和初始化枚举时会有空间和时间的成本,在有设备资源约束的情况下需要考虑
    14)大多数枚举不需要有显式的构造器或者成员,少数受益于“每个常量与属性的关联”以及“提供行为受这个属性影响的方法”;极少数枚举受益于将多种行为与单个方法关联,这种情况下,特定于常量的方法要优先于启用自有值的枚举;如果多个枚举常量同时共享相同的行为,则考虑策略枚举类型
  2. 用实例域代替序数【Item 31】
    1)所有枚举有一个ordinal方法,它返回每个枚举常量在类型中的数字位置
    2)永远不要根据枚举的序数来导出与它关联的值,而是要将它保存在一个实例域中,即每个常量的类主体中存一个与此常量相关的数据,这样常量的变更会同样带动与之关联值的变动,确保关联值的正确性
    3)Enum规范中对ordinal方法的说明是大多数程序要都不需要使用这个方法,它是设计成用于像EnumSet和EnumMap这种基于枚举的通用数据结构,除非你在编写的是这种数据结构,否则完全避免使用该方法
  3. 用EnumSet代替位域【Item 32】
    1)位域,即用int常量来初始化一个个int常量值,通过位运算来提升性能以及代码简洁性
    2)正是因为枚举类型要用在集合(Set)中,所以没有理由用位域来表示它,EnumSet类集位域的简洁和性能优势以及枚举类型的所有优点于一身,但是截止jdk 1.6,都无法创建不可变EnumSet是其唯一缺点
    3)整合EnumSet就是用单个long来表示,因此它的性能比得上位域的性能,批处理removeAll和retainAll都是利用位算法来实现的,就像手工替位域实现的那样,避免了手工位操作的容易出现的错误以及不太雅观的代码,这项任务已经由EnumSet接手
  4. 用EnumMap代替序数索引【Item 33】
    1)一旦想要在枚举中通过序数来作为key关联相关的vlaue时,更加安全的方式是使用EnumMap,并非可能绕过编译时错误检查的手动关联数组索引等方式
    2)最好不要用序数来索引数组,而要使用EnumMap。如果你所表示的这种关系是多维的,就使用EnumMap<…, EnumMap<…>>
  5. 用接口模拟可伸缩的枚举【Item 34】
    1)虽然无法编写可扩展的枚举类型,却可以通过编写接口以及实现该接口的基础枚举类型,对它进行模拟。这样允许客户端编写自己的枚举来实现接口。如果API是根据接口编写的,那么在可以使用基础枚举类型的任何地方,也都可以使用这些枚举
    2)用接口模拟可伸缩枚举有个小小的不足,即无法将实现从一个枚举类型继承到另一个枚举类型
    3)接口模拟可扩展的实现方式就是在枚举类型上implements一个接口
  6. 注解优先于命名模式【Item 35】
    1)jdk 1.5版本之前一般使用命名模式表明有些程序元素需要通过某种工具或者框架进行特殊处理,例如JUit猜测是框架要求它的用户一定要用test作为测试方法名称的开头
    2)命名模式有三大缺点
    a.文字拼写错误会导致失败,且没有任何提示
    b.无法确保它们只用于相应的程序元素上
    c.它们没有提供将参数值与程序元素关联起来的好方法
    3)注解永远不会改变被注解代码的语义,但是它可以通过工具进行特殊的处理,例如测试代码的注解有助于测试程序对测试方法的检测
    4)既然有了注解,就完全没有必要再使用命名模式了
    5)大多数程序员不必定义注解类型,但是所有的程序员都应该使用Java平台所提供的预定义的注解类型,还要考虑使用IDE或者静态分析工具所提供的任何注解
    6)注解也是一种类型
  7. 坚持使用Override注解【Item 36】
    1)随着Java 1.5版本中增加了注解,类库中也增加了几种注解类型,如Override,SuppressWarnings等
    2)应该在所有覆盖超类中的方法声明中使用Override注解,这样在编译时能帮忙明确的检测出一些错误
    3)由于在extends/implements抽象类或者接口时,如果在具体类中没有去覆盖抽象方法编译器也会报错,所以这种情况可以不用标注Override,但是如果想要用该注解来标注该方法是从超类或接口中继承过来的,可以用Override注解来区分
  8. 用标记接口定义类型【Item 37】
    1)标记接口是没有包含方法声明的接口,而只是指明一个类实现了具有某种属性的接口
    2)标记接口定义的类型是由被标记类的实例实现的,而标记注解则没有定义这样的类型
    3)如果想要定义一个任何新方法都不会与之关联的类型,标记接口是最好的选择;如果想要标记程序元素而非类和接口,考虑未来可能要给标记添加更多的信息,或者标记要适合于已经广泛使用了注解类型的框架,那么标记注解是正确的选择
    4)如果你发现自己在编写的是目标为ElementType.TYPE的标记注解类型,就应该花点时间考虑清楚,它是否真的应该为注解类型,是不是可以通过标记接口来实现,毕竟元素类型为类型
    5)如果不想定义类型就不要使用接口,也就是说如果想要定义类型,就一定要使用接口
基于IC617下Layout XL的使用 阅读详情

相关推荐

ThunderScope开源示波器

4CH,1GSa/S 开源示波器。前端很简洁,BUF802+LMH6518,ADC是HMCAD1511,用Xilinx A7 FPGA进行控制,数据通过PCIE总线传输到上位机处理。目前这个项目已经被挂到了Xilinx官网,强。设计日志:https://hackaday.io/project/180090-thunderscope开源地址:https://github.com/EEVengers/ThunderScope。

leida_wt的博客 8185

第6章 枚举和注解

第30条:用enum代替int常量 枚举类型(enum type)是指由一组固定的常量组成合法值的类型。 Java枚举类型背后的基本想法非常简单:它们就是通过公有的静态final域为每个枚举常量导出实例的类。因为没有可以访问的构造器,枚举类型是真正 的final。因为客户端既不能创建枚举类型的实例,也不能对它进行扩展,因此很可能没有实例,而只有声明过的枚举常量。换句话说,枚举类型是实

zzu-hust-madd 495

LLM大模型-vLLM本地部署全流程:Windows WSL2环境安装、HuggingFace与Modelscope模型加载与本地运行、Docker化部署与镜像分发

vLLM本地部署大模型方案 vLLM是一款高性能大模型推理引擎,通过PagedAttention技术显著提升吞吐量和内存效率,支持低成本、高并发的本地部署。 核心优势: 性能卓越:吞吐量远超同类方案,支持连续批处理等高级功能 成本优化:减少GPU服务器需求 兼容性强:提供类OpenAI的简洁API 部署步骤: 硬件准备:需NVIDIA GPU(如A100/3090),显存≥模型参数量×2(7B模型需14GB) 软件环境: Linux系统或Windows WSL2 安装CUDA 12.1+和Python 3.

2202_75674969的博客 4565

《Effective Java》读书笔记二

十五 使可变性最小化 1、一个类的只有一个默认的私有构造函数,这就说明了两点 ①其不能被初始化 ②其不能被继承(因为继承之后,子类要初始化,首先就要调用父类的构造函数,但是父类的构造函数是私有的,无法访问!同时这个功能起到了final的作用) 2、final类不能被继承,但可以实例化! 3、String类就是一个不可变类。不可变对象本质上是线程安全的,它们不要求同步;不仅可以共享不变对象

Snowball 2229

陆地观测卫星数据服务平台深度体验:高分、中巴、资源系列影像的检索与下载技巧

本文深度解析国产陆地观测卫星数据服务平台的使用技巧,重点介绍高分、中巴、资源系列卫星影像的检索与下载方法。通过权限体系解析、高级检索策略、数据预处理等实战技巧,帮助用户高效获取高质量遥感数据,适用于环境监测、资源调查等多种应用场景。

eee77的博客 980

Vscode + QT + CMake:高效开发环境搭建全攻略

本文详细介绍了如何搭建Vscode+QT+CMake高效开发环境,涵盖环境安装、配置优化及项目创建全流程。通过整合Vscode的轻量化编辑、QT的跨平台GUI开发以及CMake的现代构建管理,该组合特别适合大型QT项目和跨平台开发团队,能显著提升开发效率。

weixin_30338481的博客 504

【代码优化】注解优先命名模式

一般命名模式表明有些程序元素须要通过某种工具进行特殊处理。 比如:JUnit測试框架要求用户一定要用test作为測试方法名称的开头。这样的方法有几个严重的缺陷 首先。文字拼写错误会导致失败。可是没有不论什么提示。比方,把方法名称命名写成tsetSafety而 不是testSafety时。JUnit不错报错,可是也不会运行測试。 其次。无法确保它们仅仅用于对应的程序...

aoe41606的博客 179

面向网络攻击行为可视化分析系统实现【WebSocket + 可视化】

本系统主要应用于网站运维管理,它解决了网站运维人员排查网络攻击行为复杂且繁琐等问题,提高了运维人员网络安全分析的效率和准确性。

oNew_Lifeo的博客 1620

建议:注解优先于命名模式。

Java1.5发行版本之前,一般使用命名模式(naming pattern)表明有些程序元素需要通过某种工具或者框架进行特殊处理。例如,JUnit测试框架原本要求他的用户一定要用test作为测试方法名称的开头【Beck04】。这种方法可行,但是有几个很严重的缺点。 文字拼写错误会导致失败,且没有任何提示。 无法确保他们只用于相应的程序元素上。 他们没有提供将参数值与程序元素关...

孤芳不自赏 996

基于STM32设计的智能厨房环境监测报警系统_426

随着天然气、液化石油气等可燃性气体在家庭中的广泛应用,燃气泄漏所引发的安全问题日益突出。针对传统家用可燃气体报警器功能单一、信息获取受限以及缺乏远程监测能力等不足,设计了一种基于STM32单片机的家用可燃气体报警器系统。

760

Qt C++ 电子海图与作战叠加(Overlay)系统

lab_pos->setText(QString("坐标: X%1 Y%2").arg(p.x(),0,'f',0).arg(p.y(),0,'f',0));lab_distance->setText(QString("距离: %1 海里").arg(dist,0,'f',1));lab_bearing->setText(QString("方位: %1°").arg(bear,0,'f',1));// 绘制S-57海图基底。scene->addText("封锁线").setPos(450,180);

寒寒豆豆软件公司的博客 496

第35条:注解优先于命名模式

Java 1.5之前,一般使用命名模式表明有些程序元素需要通过某种工具或者框架进行特殊处理。例如,JUnit测试框架原本要求用户一定要用test作为测试方法名称的开头。 命名模式的缺点:1.文字拼写错误导致失败,测试方法没有执行,也没有报错 2.无法确保它们只用于相应的程序元素上,如希望一个类的所有方法被测试,把类命名为test开头,但JUnit不支持类级的测试,只在test开头的方法中生效 ...

weixin_33895604的博客 140

【STK】手把手教你利用STK进行导弹和反导仿真02 - STK/MMT模块01 导弹任务分析工具概述

种工具:导弹设计工具(Missile Design Tool,MDT )、导弹飞行工具(Missile Flight Tool,截弹,或者用内置拦截弹编辑器创建的个性化的拦截弹, IFT 能够对 ―一对一 ‖动能拦截。导设置系统参数, 并对其有效性进行验证, 画性能图,保证该设计是可行的。(SAIC)公司联合开发研制,极大扩展了 STK 原有的导弹对象的功能,能够精确仿真。IFT 能够对拦截飞机、 导弹、卫星等目标进行仿真和分析。(2)推进系统参数,包括推力,比冲,秒流量,推力持续时间,喷嘴出口面积,

weixin_44184852的博客 1876

Effective Java 第二版 第5章 泛型、第6章 枚举和注解、第7章 方法

对于未被导出的方法(unexported method),作为包的创建者,你可以控制这个方法将在哪些情况下被调用。因此你可以,并且你也应该确保只将有效的参数值传递进来。因此,例外情况:在有些情况下,有效性检查非常expensive,或者根本是不切实际的,或者有效性检查已经隐含在计算过程中完成了。例如,Collections.sort(List), 列表中的所有对象都应该是可以相互比较的。排序过程中就会进行比较,提前检查列表中的元素是否可以相互比较是没有多少意义的。

kaikai_sk的博客 901

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

读书笔记:Effective Java-第6章 枚举和注解

Item 34: Use enums instead of int constants 用枚举代替int常量

XinYuDaHai的博客 347

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[Java读书笔记] Effective Java(Third Edition) 第 6 章 枚举和注解

Java支持两种引用类型的特殊用途的系列:一种称为枚举类型(enum type)的类和一种称为注解类型(annotation type)的接口。 第34条:用enum代替int常量 枚举是其合法值由一组固定的常量组成的一种类型,例如一年中的季节,太阳系中的行星。 在将枚举类型添加到该语言之前,表示枚举类型的常见模式是声明一组名为int的常量,每个类型的成员都有一个常量。...

weixin_30702887的博客 218

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

《Effective Java》第6章 枚举和注解

第30条:用enum代替int常量 将加班工资计算移到一个私有的嵌套枚举中,将这个策略枚举(strategy enum)的实例传到PayrollDay枚举的构造器中。之后PayrollDay枚举将加班工资计算委托给策略枚举: 以上,方法overtimePay()在每个枚举类示例中实现,对外提供一致的pay()方法。 第31条:用实例域代替序数 永远不要根据枚举的序数导出...

weixin_30295091的博客 102

Effective Java读书笔记(第6章-枚举和注解)

第6章  枚举和

lyl_tkb的专栏 632

[Effective Java 读书笔记] 第6章 枚举和注解

第三十条 用enum代替int 总得来说,使用enum有几点好处 1.编译时的类型安全, 2.可以保证就是自己定义的值,不会有月结风险, 3.每个枚举类型有自己的命名空间 4.枚举可以添加任意的方法和域 5.枚举类型是final的无法实例化,也就是实例可控的。。 第三十一条 用实例域替代序数 即不要依赖枚举值得定义顺序来指定他们的值,而应该讲枚举保存在一个实例域中,类似厦门的val...

weixin_34355559的博客 119

Effective Java 2 读书笔记 第6章 枚举和注解

第30条:用enum代替int常量 枚举类型对比int枚举,String枚举等 易读(不同枚举可以包含同名等) 更加安全(不同枚举值不可以互操作) 功能更加强大(可以添加任意的方法和域,并实现任意接口,为了将数据与枚举常量关联起来,得声明实例域,并编写一个带有数据并将数据保存在域中的构造器) 可以将数据与枚举常量关联起来,得声明实例域,并编写一个带有数据并将数据保存在域中的构造器 ...

econsh的专栏 140

《Effective Java》学习笔记——第6部分枚举和注解

Effective Java》第6部分“枚举和注解”详细讲了如何在 Java 中使用枚举(enum)和注解(annotation)这两个重要特性。枚举和注解自 Java 5 引入以来,极大地增强了 Java 的表达能力和类型安全性。正确地使用它们可以提高代码的可读性、可维护性和可靠性。原因:自定义注解可以用于标记类、方法、字段等,允许开发者在编程时嵌入特定的元数据。这些元数据可以通过反射 API 来读取,从而实现一些额外的功能,如代码检查、日志生成、配置读取等。

weixin_37693760的博客 814

带你快速看完9.8分神作《Effective Java》—— 枚举 & 注解篇

豆瓣评分9.8的图书《Effective Java》,是当今世界顶尖高手Josh Bloch的著作,在我之前的文章里我也提到过,编程就像练武,既需要外在的武功招式(编程语言、工具、中间件等等),也需要修炼心法(设计模式、源码等等)学霸、学神OR开挂 我个人在Java领域也已经学习了近5年,在修炼“内功”的方面也通过各种途径接触到了一些编程规约,例如阿里巴巴的泰山版规约,在此基础下读这本书的时候仍是让我受到了很大的冲激,学习到了很多约定背后的细节问题,还有一些让我欣赏此书的点是,书中对于编程规约的解释让我感

如切如磋,如琢如磨 1797

《Effective Java》枚举和注解

《Effective Java》第五章 枚举和注解

qq_43350524的博客 790

【总结】Effective java经验之谈,枚举,注解,方法,通用设计,异常

这几章看的比较快,内容就如同标题一样比较容易理解,所以只有部分内容会在[]中解释,其他的就直接理解标题,并不影响阅读质量。不过如果时间充足的话,还是仔细读一读原书的内容,相信还是有所收获的。主要最近自己想进入算法与机器学习部分,尽快结束这本书。 另一方面,讨论一些自己感兴趣的内容,我会将搞过的东西总结下。后面可能写一部分关于java字节码阅读以及编写的东西。只所以这么来,是因为字节码编程还是非常用途

阿利在努力 2420

Effective Java——枚举和注解

目录 三十、用enum代替int常量 三十一、用实例域代替序数 三十二、用EnumSet代替位域 三十三、用EnumMap代替序数索引 三十四、用接口模拟可伸缩的枚举 三十五、注解优先于命名模式 三十六、坚持使用override注解 三十七、用标记接口定义类型 三十、用enum代替int常量         枚举类型是指由一组固定的常量组成合法值的类型,该特征是在J

痕泽的专栏 833

Effective java 总结5 - 枚举和注解

java两种特殊的引用类型类枚举类型接口注解类型标记接口不包含方法声明的接口标记接口对于标记注解的优势标记接口定义的类型由被标记的类的实例实现,标记注解没有定义这样的类型允许在编译时捕捉到注解运行时才能捕捉到的错误可以被更加精确地锁定标记注解是更大注解的一部分,在支持注解作为编程元素的框架中具有一致性egjava.io.Serializable表明实现该接口才能序列化,反序列化选择标记接口想要定义一个任何新方法不不会与之关联的类型标记注解。...

ym & blog 423
上一篇: 《Effective Java》第5章 泛型
下一篇: 《Effective Java》第7章 方法
AnnaLoad
博客等级 码龄17年 7粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值