首页 > 编程语言 >《Effective Java》阅读笔记-第九章

《Effective Java》阅读笔记-第九章

时间:2024-02-21 16:26:44浏览次数:39  
标签:反射 Java Effective 第九章 性能 接口 使用 类型

Effective Java 阅读笔记

第九章 通用编程

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

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

  • 将局部变量的作用域最小化,最好的办法就是在第一次使用变量的地方声明它。
  • 几乎每一个局部变量都应该进行初始化。

第 58 条 for-each 循环优先于传统 for 循环

for-each(又称增强 for 循环)隐藏了迭代器和索引变量,避免了出错的可能(特别是嵌套循环时)。

但是下面集中情况无法使用 for-each 循环:

  • 解构、过滤:如果需要删除集合种特定元素,就需要使用迭代器,并调用remove方法,或者使用 Java 8 的removeIf方法。
  • 转换:如果需要下标对特定元素进行处理,就只能使用普通循环。
  • 并行迭代:如果需要同时迭代两个循环(特别是嵌套时),就需要操作下标,并进行手动控制迭代。

第 59 条 了解并使用类库

使用类库比自己造轮子更靠谱。比如 Java 7 之后生成随机数就不要使用 Random 类,使用 ThreadLocalRamdom 类,新类更快并且线程安全。

第 60 条 如果需要非常精确的答案,不要使用 float 或者 double

浮点数是不够精确的,不适合用来进行金融计算。

BigDecimal来代替 double。如果有最小单位时,可以使用 int 或者 long 进行计算,性能更好,并且也非常精确(但是除法就不行了)。

第 61 条 基本类型优先于装箱类型

基本类型更节省空间,并且计算速度更快(因为不用去堆中创建空间);

自动拆装箱减少了基本类型的烦琐性,但是并没有减少风险。
自动拆箱时,如果包装类型是null,就会抛出空指针异常。

第 62 条 如果其他类型合适,尽量避免使用字符串

字符串更容易出错,并且通常性能也更低。能使用其他类型的时候,尽量使用其他类型。

第 63 条 了解字符串连接的性能

使用+可以很方便的拼接字符串,但是会有性能问题。虽然 Java 8 之后反编译加号拼接其实还是StringBuilder,但是有些情况下会大量创建 StringBuilder对象,导致性能下降。

因此在拼接字符串时可以手动创建 StringBuilder 然后使用 append 方法进行拼接。大多数时候,相对加号拼接而言都是更快的。

第 64 条 通过接口引用对象

第 51 条有:使用接口作为参数,而不是使用类。更确切的来说,是使用接口来引用对象,而不是用类来引用。

如果有合适的接口类型存在,那么参数、返回值、变量、字段等都应该使用接口来声明。

如果养成了使用接口作为类型的习惯,程序会更加灵活。

在没有合适的接口时,完全可以使用类来引用对象(这不废话吗)。更准确的说,是如果没有合适的接口,就用类层次中提供了必要功能的最小具体类来引用对象。

第 65 条 接口优先于反射机制

反射允许在运行时访问给定义一个 Class 的构造器、方法、字段等,非常灵活,但是也有以下缺点:

  • 损失了编译时的类型检查:如果用反射调用不存在的方法,会发生运行时异常。
  • 执行反射访问所需要的代码非常笨拙、冗长:反射代码非常乏味,并且阅读起来也很困难。
  • 性能损失:反射比起直接调用要慢了不少。

如果有限制的使用反射,虽然也有部分代价,但是也有非常多的好处。

许多程序必须用到的类在编译时是不可用的,但是有适当的接口或者超类可以引用这个类,如果是这种情况,就可以通过反射创建实例,然后通过接口或者超类进行引用,然后正常调用。
这样性能比Method.invoke要好。

第 66 条 谨慎地使用本地方法

使用本地方法来提高性能的做法不值得提倡。因为 Java 越来越快了,并且标准库中已经提供了大部分需要的实现。

第 67 条 谨慎地进行优化

  • 不要为了性能编牺牲合理的结构,要努力编写好的程序而不是快的程序。
  • 要努力避免性质性能的设计。
  • 要考虑 API 设计的性能后果。
  • 为了获得好的性能而对 API 进行包装是一种非常不好的想法。
  • 尝试优化的前后,要做出性能对比。

第 68 条 遵循普遍接受的命名惯例

每种语言一般都有各自推荐的命名方式,Java 也不例外:

标识符或类型 示例
包或者模块 org.junit.jupiter.api, com.google.common.collect
类或者接口 Stream, FutureTask, LinkedHashMap, HttpClient
方法或者字段 remove, groupBy, getCrc
常量 MIN_VALUE, HEGATIVE_INFINITY
局部变量 i, denom, houseNum
泛型 T, E, K, V, X, R, U, T1, T2

标签:反射,Java,Effective,第九章,性能,接口,使用,类型
From: https://www.cnblogs.com/code-blog/p/18025532

相关文章

  • 《Effective Java》阅读笔记-第八章
    EffectiveJava阅读笔记第八章方法第49条检查参数的有效性基于“发生错误后应尽快检测出错误”这一通用原则,应对方法的参数进行检查。Java7中增加了Objects.requireNonNull方法,可以很方便的对参数进行null检查并抛出异常:publicvoidsomeMethod(Stringargs){ar......
  • 《Effective Java》阅读笔记-第十一章
    EffectiveJava阅读笔记第十一章并发第78条同步访问共享的可变数据多线程访问变量时,需要进行同步,否则就会产生并发问题。同步代码块、加锁等或者直接不共享变量,也就是将可变数据限制在单个线程内。ThreadLocal这种第79条避免过度同步为了避免活性失败和安全性失败......
  • 《Effective Java》阅读笔记-第十章
    EffectiveJava阅读笔记第十章异常第69条只针对异常的情况才使用异常说白了就是不要吧你的业务逻辑用异常来写。举个反例比如用抛出异常来遍历一个数组:try{inti=0;while(true){range[i++].doSomething();}}catch(ArrayIndexOutOfBoun......
  • 《Effective Java》阅读笔记-第十二章
    EffectiveJava阅读笔记第十二章序列化第85条其他方法优先于Java本身的序列化Java本身的序列化漏洞过多,很容易被攻击。避免被序列化攻击的最好方式就是不要反序列化任何字节流,并且新的系统中没有任何理由使用Java本身的序列化。JSON和Protobuf是两种优秀的序列化......
  • java类初始化及代码块加载顺序连根拔起
    说明相信很多人对于java中父子继承关系中,子类实例化调用过程中,代码块的执行顺序都容易忘记或搞混,尤其是java初级笔试题或面试题最容易出这类题目,让人恨得牙痒痒!!!本文就一次性将其连根铲除,看完你就不会有这个烦恼了,哈哈。先引用一下骨灰级大作《Java编程思想》的复用章节Java......
  • 一键脚本破解最新版 idea 步骤,开启学习java 之旅,好好好
    效果:步骤1、idea安装:直接在官网下载最新idea-2022.2.3.dwg(:官网地址,然后根据安装引导一步一步完成安装即可,完成后打开idea看到如下效果表示idea安装成功!如图发现idea需要注册!这里我们先不管,直接关闭idea准备激活!步骤2、下载最新的破解包https://pan.baidu.com/s/1iQby9......
  • Hutool - 简化Java编程的法宝,让工作更高效
    一、在项目的pom.xml的dependencies中加入以下内容:<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.0.7</version></dependency>非Maven项目的话就自己百度下载一下jar包,导入即可。二、StrUtil看这里名字也应该明白了,......
  • 程序是怎样跑起来的第九章读后感
    读完第九章后,我对程序的文件I/O有了更清晰的认识。这一章详细介绍了文件I/O的基本概念、文件的打开与关闭、读取与写入以及文件的随机访问等内容。我了解到文件I/O是程序与外部世界进行数据交互的重要方式,它允许程序读取和写入文件中的数据。通过文件的打开和关闭操作,程序......
  • 承前启后,Java对象内存布局和对象头
    承前启后,Java对象内存布局和对象头大家好,我是小高先生。在我之前的一篇文章《并发编程防御装-锁(基础版)》中,我简要介绍了锁的基础知识,并解释了为什么Java中的任何对象都可以作为锁。在那里,我提到了对象头中有一个指向ObjectMonitor的指针,但没有深入探讨Java对象的内存结构。本文将......
  • Java的配置
    环境变量配置找到配置的位置右击此电脑-->属性-->高级系统设置-->环境变量-->系统变量配置Path环境变量(必须配置的)(目的:为了可以在任意目录下找到javac和java命令)方式1:直接在Path变量中添加jdk的bin目录的完整路径系统变量-->Path-->新建-->D:\soft\java\jdk\bin方式2:(推荐......