《Effective Java》知识点(8)--通用编程

57. 将局部变量的作用域最小化

       将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。

       要使局部变量的作用域最小化,最有力的方法就是在第一次要使用它的地方进行声明。另一方法是使方法小而集中。

       几乎每一个局部变量的声明都应该包含一个初始化表达式。

       for循环优先于while循环。for循环更能避免“剪切-粘贴”错误;更简短,可读性更好。

58. for-each循环优先于传统的for循环

       与传统的for循环相比,for-each循环在简洁性、灵活性以及出错预防性方面都占有绝对优势,并且没有性能惩罚的问题。多重循环时,for循环容易出错。

       无法使用for-each的三种情况:

   a. 如果需要遍历集合,并删除选定的元素,就需要使用显式的迭代器,以便调用remove方法。

   b. 如果需要遍历列表或者数组,并取代它的部分或者全部元素值,就需要用迭代器或数组索引。

   c. 如果需要并行地遍历多个集合,就需要显式地控制迭代器或者索引变量,以便所有迭代器或索引变量可以同步前进。

59. 了解和使用类库

       使用标准类库的好处: 

   a. 可以充分利用这些编写标准类库的专家的知识,以及在你之前的其他人的使用经验。

   b. 不必浪费时间在底层细节,而把时间花在应用程序上。

   c. 它们的性能会随着时间推移而不断提高。

   d. 它们会随着时间的推移而增加新的功能。

   e. 可以使自己的代码融入主流。

每个程序员都应该熟悉java.lang、java.util、java.io及其子包中的内容。 

优先在类库查找所需功能,如果类库找不到,下一个选择应该是在高级的第三方类库去寻找,如Guava类库。如果都找不到,最好才是选择自己实现这些功能。

60. 如果需要精确的答案,请避免使用float和double

     float和double类型尤其不适合用于货币计算。请优先使用BigDecimal,如果性能是关键,可以使用int或long。如果数值不超过9位十进制数,使用int;如果不超过18位,使用long;如果可能超过18位,还是用BigDecimal。

61. 基本类型优先于装箱基本类型

      基本类型(int,double,boolean)比装箱基本类型(Integer,Double,Boolean)更加简单、快速,应优先使用。

61.1 基本类型和装箱类型的区别:

  a. 基本类型只有值,而装箱类型具有与它们的值不同的同一性。

  b. 基本类型只有函数值,而装箱类型除了函数值,还有个null。

  c. 基本类型通常比装箱类型更节省时间和空间

61.2 什么时候用装箱类型

   a. 作为集合中的元素、键和值

   b. 在参数化类型和方法中,必须用装箱类型作类型参数

   c. 在进行反射的方法调用时

61.3 使用装箱注意事项

    a. 对装箱类型运用==操作符通常是错误的,因为比较的是对象而不是值

    b. 当在一项操作中混用基本类型和装箱类型是,装箱类型会自动拆箱,可能抛出空指针异常

    c. 当基本类型转装箱时,会导致资源消耗和不必要的对象创建

62. 如果有其他类型更适合,则尽量避免使用字符串

       字符串不适合代替基本类型。

       字符串不适合代替枚举类型。

       字符串不适合代替聚合类型。

       字符串不适合代替能力表(capabilities),如授权访问中作key。 

63. 了解字符串连接的性能

63.1 不要使用字符串连接操作符来合并多个字符串(需要n的平方级的时间)

63.2 使用StringBuilder的append方法来连接字符串

63.3 使用字符数组,或者每次只处理一个字符串,而不是将它们组合起来

64. 通过接口引用对象

       如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,就都应该使用接口类型进行声明。养成用接口作为类型的习惯,程序将会更加灵活。如果没有合适的接口,就用类层次结构中提供了必要功能的最小的具体类来引用对象。

       不存在适当接口类型的情形:

   a. 值类(如String,BigInteger)经常是final的,且很少有对应的接口。

   b. 对象属于一个框架,而框架的基本类型是类,不是接口。一般用基类(抽象类)引用对象。

   c. 类实现了接口,但它提供了接口不存在的额外方法。 这种类只能引用它的实例。

65. 接口优先于反射机制

       核心反射机制(core reflection facility),java.lang.reflect包,提供了“通过程序来访问任意类”的能力。反射机制允许一个类使用另一个类,即使当前者被编译的时候,后者还根本不存在。如果编写的程序必须要与编译时未知的类一起工作,如有可能应该仅仅用反射机制来实例化对象,而访问对象时则使用编译时已知的某个接口或者超类。

       反射机制的代价:

   a. 损失了编译时类型检查的优势,包括异常检查。可能运行时失败。

   b. 执行反射访问所需的代码非常笨拙和冗长,阅读困难。

   c. 性能损失。 反射方法调用比普通方法调用慢许多。

66. 谨慎地使用本地方法

      所谓本地方法是指用本地编程语言(如C或C++)来编写的方法。JNI允许Java程序调用本地方法。使用本地方法来访问特定于平台的机制是合法的,但是几乎没有必要。

      使用本地方法来提高性能的做法不值得提倡。

      使用本地方法的一些缺陷:

  a. 程序可能受内存毁坏错误的影响,因为本地语言不是安全的。

  b. 程序不可自由移植,因为本地语言是平台相关的。

  c. 程序更难调试

  d. 还可能降低性能,因为内存回收不是自动的,并且进入和退出本地代码需要相关开销。

  e. 需要“胶合代码”的本地方法编写起来单调乏味,难于阅读。

67. 谨慎地进行优化

      优化的弊大于利,特别是不成熟的优化。

      不要为了性能而牺牲合理的结构。努力编写好的程序而不是快的程序。

       必须在设计过程中考虑性能问题,而不是系统完成之后要努力避免那些限制性能的设计决策。最主要的组件是API、交互层协议以及永久数据格式。要考虑API设计决策的性能后果。

       在每次试图做优化之前和之后,要对性能进行测量。如果将要在多个JVM实现和多种硬件平台上运行程序,则需要在每个Java实现和平台上测量优化效果。

       系统构建完后应该测量性能。如果不够快,则可以在性能分析器的帮助下,找到问题的根源,然后设法优化系统中相关的部分。第一个步骤是检查所选择的算法:再多的低层优化也无法弥补算法的选择不当。必要时重复这个过程。

68. 遵守普遍接受的命名惯例

      命名惯例分两大类:字面的和语法的。

标识符类型字面惯例示例
包或者模块名称应该是层次状的,用句号分割每个部分。每个部分是小写字母,偶有数字。org.junit.jupiter.api
类或者接口(包括枚举和注解)一个或多个单词,每个单词的首字母大写Stream,HttpClient
方法或者域第一个字母小写remove,groupingBy
常量域字母都小写,每个单词间用下划线MIN_VALUE
局部变量允许缩写,单个字符和短字符序列,取决于上下文环境i,houseNum
类型参数单个大写字母

T:  任意类型

E:  集合的元素类型

K和V: 映射的键和值

X:  异常

R:  函数的返回类型

T、U、V、T1、T2、T3: 任何类型的序列

      语法命名惯例比字面惯例更加灵活,也更有争议。

标识符类型语法惯例示例
可实例化的类(包括枚举)名词或名词短语Thread
不可实例化的工具类复数名词Collectors
接口名词或形容词Collection,Runnable,Accessible
注解名词、动词、介词、形容词Inject,Singleton
执行动作的方法动词或动词短语append
返回boolean的方法is开头isDigit
设置对象属性的方法set开头setAttribute
获取对象属性的方法get开头getAttribute
转换对象类型的实例方法toTypetoString,toArray
返回视图的方法asTypeasList
返回与被调用对象同值的方法typeValueintValue
静态工厂

from,of,valueOf,

instance,getInstance,newInstance,

getType,newType

       不要盲目遵从惯例,请使用大家公认的做法。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

二、局域网联机

目录 1.下载资源包 2.配置NetworkManager 3.编写测试UI 1.下载资源包 2.配置NetworkManager (1)在Assets/Prefabs下创建Network Prefabs List 相应设置如下: (2) 创建空物体“NetworkManager”并挂载NetworkMan…

Java编程技巧:跨域

目录 1、跨域概念2、后端CORS(跨域资源共享)配置原理3、既然请求跨域了,那么请求到底发出去没有?4、通过后端CORS(跨域资源共享)配置解决跨域问题代码4.1、SpringBoot(FilterRegistrationBean&a…

重新认识mysql

title: “重新认识mysql” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” 文章目录 title: "重新认识mysql" createTime: 2022-03-06T15:…

Flutter笔记 - 用于描述Align的Alignment、AlignmentDirectional、AlignmentTween类

Flutter笔记 用于描述Align的Alignment、AlignmentDirectional、AlignmentTween类 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_…

iPhone 15首批体验出炉,掉漆、烫手、进灰,口碑严重崩塌

眼看 iPhone 15 系列已经上架,不知道大伙儿剁手了没有? 哦,原来你们也在等首批用户体验反馈啊! 随着 22 号正式开售,到目前不少人陆续上手 iPhone 15 系。 咱们也是翻阅了大量贴吧用户反馈、电商平台评论等&#xff…

C++goto语句

在本文中,您将了解goto语句,它是如何工作的,以及为什么应该避免它。在C 编程中,goto语句用于通过将控制权转移到程序的其他部分来更改程序执行的正常顺序。 goto语句的语法 goto label; ... .. ... ... .. ... ... .. ... label…

Spring5应用之JDK动态代理

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 前言JDK动态代理开…

环形链表[简单]

优质博文:IT-BLOG-CN 一、题目 给你一个链表的头节点head,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链…

嵌入式开源库之libmodbus学习笔记

socat 安装sudo apt-get install socat创建终端 socat -d -d pty,b115200 pty,b115200查看终端 ls /dev/pts/ minicom 安装 sudo apt-get install minicom链接虚拟终端 sudo minicom -D /dev/pts/3以十六进制显示 minicom -D /dev/pts/1 -H设置波特率 minicom -D /dev/pts/1…

python操作.xlsx文件

from openpyxl import load_workbook from openpyxl.styles import Font,colors, Alignment from openpyxl.styles import Border, Side #打开已经存在的Excel workbook load_workbook(filenameC:\\Users\\yh\\Documents\\测试.xlsx) #创建表(sheet),插…

【机器学习】熵和概率分布,图像生成中的量化评估IS与FID

详解机器学习中的熵、条件熵、相对熵、交叉熵 图像生成中常用的量化评估指标通常有Inception Score (IS)和Frchet Inception Distance (FID) Inception Score (IS) 与 Frchet Inception Distance (FID) GAN的量化评估方法——IS和FID,及其pytorch代码

STM32G070RBT6-MCU温度测量(ADC)

1、借助STM32CubeMX生成系统及外设相关初始化代码。 在以上配置后就可以生成相关初始化代码了。 /* ADC1 init function */ void MX_ADC1_Init(void) {/* USER CODE BEGIN ADC1_Init 0 *//* USER CODE END ADC1_Init 0 */ADC_ChannelConfTypeDef sConfig {0};/* USER COD…

pandas读取文件的时候出现‘OSError: Initializing from file failed’

报错原因: pandas.read_csv() 报错 OSError: Initializing from file failed,一般由两种情况引起:一种是函数参数为路径而非文件名称,另一种是函数参数带有中文。 原代码: data pd.read_csv(csv文件.csv) data导入文…

QT:绘图

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> //绘图事件class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent 0);~Widget();void paintEvent(QPaintEvent *event); //重写绘图事件void timerEve…

计算机竞赛 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习猫狗分类 ** 该项目较为新颖&a…

【自定义类型】--- 位段、枚举、联合

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言进阶之路&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅数据结构探索&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

OCI 发布了容器运行时和镜像规范!

7 月 19 日是开放容器计划Open Container Initiative&#xff08;OCI&#xff09;的一个重要里程碑&#xff0c;OCI 发布了容器运行时和镜像规范的 1.0 版本&#xff0c;而 Docker 在这过去两年中一直充当着推动和引领的核心角色。 我们的目标是为社区、客户以及更广泛的容器行…

问答区混赏金的集合贴

此贴专记录CSDN问答社区里面&#xff0c;一些回答者在临近结题时胡乱回答&#xff0c;只为分取结题赏金的人。 为了截图方便&#xff0c;给回答者点赞和点踩不是对其回答的认可和不认可&#xff0c;只是为了方便截图而已 文章目录 第一位——夜深人静的哝玛 (PS:与本人的头像和…

为什么都说NFS读写性能差,如何进行优化?

使用基于NFS协议存储系统的同学经常遇到的问题是在小文件比较多的情况下性能会比较差。小文件访问性能差本身是可以理解的,但是NFS确实是太差了。不知大家是否深层次分析过,为什么NFS访问小文件性能会这么差? NFS文件系统与本地文件系统的差异在于多了一个网络传输的过程。…

基于or-tools的人员排班问题建模求解(JavaAPI)

使用Java调用or-tools实现了阿里mindopt求解器的案例&#xff08;https://opt.aliyun.com/platform/case&#xff09;人员排班问题。 这里写目录标题 人员排班问题问题描述数学建模编程求解&#xff08;ortoolsJavaAPI&#xff09;求解结果 人员排班问题 随着现在产业的发展&…