您的位置:首页 > Web前端

Effective Java 读书笔记(七):通用程序设计

2017-10-12 20:04 260 查看
Effective Java 读书笔记七通用程序设计
将局部变量的作用域最小化

for-each 循环优于传统的 for 循环

了解和使用类库

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

基本类型优于装箱基本类型

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

当心字符串连接的性能

通过接口引用对象

接口优先于反射机制

谨慎地使用本地方法

谨慎地进行优化

遵循普遍接受的命名惯例

Effective Java 读书笔记(七):通用程序设计

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

这一条与之前的“使类和成员的可访问性最小化”本质上类似,将局部变量的作用域最小化,可以增强代码的可读性和可维护性,降低出错的可能性。

最简单的方法,是在第一次使用它的地方声明。

几乎每个局部变量的声明,都应该包含一个初始化表达式。不过,在 try catch 语句的代码中,有时候会有例外,为了在 catch 到异常时,输出一些关键信息到日志,某些关键变量需要在 try 之前声明。

for 循环优于 while 循环,为什么呢?因为 for 循环中用于判断循环条件的变量,作用域只在 for 循环包含的语句中,而 while 循环做不到这一点。for 循环的其他优点有:更简短,增强了可读性。

for-each 循环优于传统的 for 循环

for-each 本质上还是对普通 for 循环(迭代器、下标遍历)的封装,因为经过了封装,使用起来更加简洁、方便,还能够避免使用迭代器和下标时的一些坑:多次调用 next,循环控制条件中下标写错造成死循环等等。

另外,还有一些情况不适合用 for-each:

1. 过滤:循环的过程中需要删除元素。

2. 转换:需要修改某些元素。

3. 平行迭代:并行遍历多个集合时。

了解和使用类库

不要重新发明轮子。使用标准类库有什么好处呢?

1. 标准类库是由专家进行设计的,质量有保证。

2. 不必浪费时间在底层实现上,可以有更多时间专注于关键问题。

3. 性能会随着时间的推移、版本的升级,不断提高。

4. 可以使自己的代码融入主流,易读、易维护。

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

推荐使用 BigDecimal。如果对性能有要求,数值范围不超过 9 位十进制数字,可以使用 int;不超过 18 位可以使用 long。

基本类型优于装箱基本类型

Java 类型系统由两部分组成:基本类型(int、boolean 等),引用类型(String、List)。基本类型 int、long 都有一个对应的引用类型,称为装箱基本类型 Integer、Long。装箱基本类型相对于基本类型有什么区别呢?

1. 创建对象耗费性能。

2. == 操作符在装箱基本类型上的比较是对引用地址的比较,和基本类型不一样。

3. 装箱基本类型需要显示初始化,未初始化使用或拆箱时,会有 NullPointerException。

什么时候必须使用装箱基本类型呢?

1. 集合中。

2. 泛型的类型参数。

3. 反射。

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

字符串不适合代替其他值类型,如果需要表示整数就用 int,需要表示布尔值就用 boolean。

字符串不适合替代枚举类型,当然 int 也不适合替代枚举类型。

字符串不适合替代聚集类型,使用适当的类型可以让程序更加清晰易读。

如果使用不当,字符串会比其他类型更加笨拙、更不灵活、速度更慢,也更容易出错。

同理,也不应该用 Map 来存储可以使用简单对象 POJO 表示的数据。

当心字符串连接的性能

字符串本身是不可变对象,字符串的拼接(+)会生成全新的字符串,比较耗费性能,最好使用 StringBuilder 来提升性能。

使用新版本的 JDK 编译,会自动把普通的字符串拼接 + 转换成 StringBuilder 来提升性能。

通过接口引用对象

之前有一个建议:应该使用接口而非类来作为参数的类型。更一般地,如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,就都应该使用接口类型进行声明。

使用接口,你的程序将更加灵活,可以很容易地改变具体的实现。可是为何要改变实现呢?一般是为了更好的性能。

当然了,使用接口的前提是:接口提供的功能可以满足要求。如果需要特点实现采用的功能,那也只能使用实现类了。

接口优先于反射机制

反射机制十分强大,但是有很多缺点:

1. 丧失了编译时类型检查的好处。

2. 执行反射访问的代码,非常笨拙和冗长。

3. 性能差。

谨慎地使用本地方法

Java Native Interface(JNI)运行 Java 应用程序调用本地方法,所谓本地方法是利用本地程序设计语言(比如 C、C++)编写的特殊方法。历史上,本地方法有三种用途:

1. 提供了访问特定于平台机制的能力。

2. 访问遗留代码库。

3. 提升性能。

本地代码有什么缺点呢?不能跨平台、难维护、随着 JVM 的优化性能优势已经不大了。

谨慎地进行优化

有三条与优化有关的格言,是每个人都应该知道的:

1. 很多计算上的过失都被归咎于效率,而不是任何其他原因 —— 甚至包括盲目地做傻事。 by William A. Wulf

2. 不要去计较一些效率上的小得失,在 97% 的情况下,不成熟的优化才是一切问题的根源。 by Donald E. Knuth

3. 在你还没有绝对清晰的优化方案之前,不要进行优化。 by M. A. Jackson

不要因为性能而牺牲合理的结构。要努力编写好而非快的程序。实现上的问题可以通过后期的优化而得到修正,但是遍布全局并且限制性能的结构缺陷,几乎是不可能被改正的,除非重新编写系统。所以,要努力避免那些会限制性能的设计决策

在每次试图做优化之前和之后,要对性能进行测量。不要实施效果不明显的优化。

具体如何做性能优化可以看看:性能优化概述

遵循普遍接受的命名惯例

遵循惯例,能够让程序易读、易维护、减少出错。

遵循所在组织的编程规范即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: