本书囊括了笔者多年编程经验总结出的六项编辑密技:完美规约、完美视角、完美利用、完美改造、完美优化、完美突破,这六项密技是完美编程的精髓,亦是完美编程的指导思想与灵魂。本书还包含77个经典优化案例及28种常用优化技巧。
适读人群 :软件开发人员及相关专业师生
Java是目前的主流开发技术,如何更好地发挥其技术优势实现资源配置和获得更高商业价值,一直是Java技术发展的趋势。然而Java体系庞大、技术精深,如何写出优质代码,如何设计与优化系统架构,是高级开发者必须掌握的核心技术之一。本书所面向的读者主要是那些想在技术领域成为佼佼者的朋友:
1.走在架构师之路上的工程师。
2.希望提高自己代码质量水平的程序员。
3.追求完美的技术爱好者。
总之,无论是在校大学生还是刚刚走上工作岗位的新员工,无论是做编码的程序员还是做测试的技术人员,无论是架构师还是项目经理,都可以从本书中获得有益的收获。
在武侠世界里,凡是顶尖的高手,要么是经历了一些奇遇偶得真传,要么就是经过几十年脚踏实地的修炼,才得以炉火纯青。虽然路不同,但他们最核心的修炼内容就是增强自己的内力。内功心法才是核心,因为剑法、拳法之类对聪明人来讲看一遍就会,而内力却很难速成。到达一定的境界后,武功就不分什么门派了,因为这都是融会贯通的。
现实科技世界与武侠科幻世界同理,Java程序世界里也不乏顶尖高手,比如Bruce Eckel (《Thinking In Java》作者)、Joshua Bloch(Google首席Java架构师,《Effective Java》作者)、 Kent Beck(敏捷之父)、Martin Fowler(优化之父)等等。这些人之所以如此成功,并让追求者顶礼膜拜,并不是因为他们写了汗牛充栋的程序代码,而在于他们一出手就能展现绝顶高手的风范,写出令人拍案叫绝的高质量代码。因为这代表了他们的品牌与实力,他们会一直精益求精,不断优化,他们把自己的悟道——如何修炼内功秘籍——写成了书,就成了经典。
程序员修炼内功心法的终极目标就是成为我们梦寐以求的架构师。众所周知的《Java编程思想》《Java高效编程》《敏捷软件开发》《设计模式》《优化》《人月神话》等巨著的核心内容之一就是教授这些内功心法,本书也正是作者多年修炼的总结。品质体现于细节,本书不但从宏观到细节进行了全面系统的介绍,而且形成了代码质量优化的理论与技巧体系,是进行代码优化不可多得的宝典。
颜廷吉,山东临沂人,毕业于北京大学软件与微电子学院,硕士学位。上海颐凡软件科技有限公司创始人兼首席架构师,高级系统工程师,“颐凡Java应用开发平台”软件著作权人,拥有PMP、OCP、LIP3等各种高级国际技术认证证书,日本国家高度人才。
2007年就职于NTTDATA集团公司,任研发部主任,从事一线软件研发与设计近十年。曾经主导与参与了日本厚生劳动省HelloWork就职劳动项目、
Taspo全国香烟自动贩卖项目、饮料自动贩卖机贩卖信息采集项目等大型系统的设计与研发,曾连续多年获得公司社长奖,项目奖等各种奖项。
序
前言
第1章 代码质量 1
1.1 什么是代码质量 1
1.2 什么是软件质量 1
1.3 代码质量与软件质量 1
1.4 代码质量优化理论 2
1.5 提高代码质量手段 3
小结 3
第2章 代码质量静态检查工具 4
2.1 静态分析技术概述 4
2.2 静态分析技术原理 4
2.3 静态分析技术给我们带来的好处 5
2.4 常用重要静态分析工具 6
2.5 如何优化静态分析工具 6
小结 11
第3章 代码质量优化通用准则 12
3.1 避免使用空块 12
3.2 避免使用空类 15
3.3 去掉多余的import 16
3.4 剪切无效代码 17
3.5 制定命名体系规约 18
编程解密一:完美规约 20
优化技巧01:按照命名规约赋予名称 20
3.6 去掉重复代码 21
3.7 如何优雅使用switch语句 22
3.8 用大写“L”代替小写“l”定义long变量 24
3.9 避免在一条语句中声明或赋值多个变量 25
3.10 去掉控制标志的临时变量 26
优化技巧02:移除控制标志临时变量 27
3.11 避免赋予临时变量过多的角色 28
优化技巧03:赋予临时变量单一职责 29
3.12 避免使用魔法数字 29
优化技巧04:用常量取代魔法数字 30
3.13 在for循环内修正增量因子有什么弊端 31
3.14 用Enum代替Integer类型码常量 32
优化技巧05:用枚举取代类型码 34
3.15 用BigDecimal类型进行精确计算 35
3.16 避免混用“+” 36
3.17 避免混用复杂运算符 37
3.18 避免使用复杂条件式或分支 38
优化技巧06:用代码片段拆分复杂表达式 41
优化技巧07:用卫语句代替嵌套条件表达式 42
优化技巧08:用多态代替条件表达式 43
3.19 如何深入理解“= =”的真正含义 44
3.20 要习惯于用泛型代替原生类型 48
3.21 如何正确使用通配符的边界 53
3.22 如何发挥正则表达式的威力 55
小结 58
第4章 方法优化技巧 59
4.1 最小化原则 59
优化技巧09:封装类成员 60
4.2 hashCode()与equals()是个孪生兄弟 61
4.3 使用string.equals("String")带来的弊端 66
4.4 避免命名不具有继承关系的同名方法 67
4.5 检查参数的有效性 68
4.6 避免使用可变参数 69
4.7 如何优化过长参数 72
优化技巧10:把参数提升成类成员变量 73
优化技巧11:引入参数对象 74
4.8 为什么不要重写静态方法 75
4.9 避免使用过时的API 77
4.10 优雅的集合运算方法知多少 78
4.11 避免重复发明轮子 81
4.12 如何对臃肿的方法进行瘦身 82
优化技巧12:分解方法 84
优化技巧13:合并方法 85
小结 85
第5章 如何保证多线程代码质量 86
5.1 为什么不要重写start()方法 86
5.2 避免使用非线程安全的初始化方法 87
5.3 用final成员对象作为同期化对象锁 90
5.4 在synchronized内使用wait()方法 92
5.5 尽量缩小同期化代码范围 93
小结 94
第6章 如何优化类与接口 95
6.1 避免创建不必要的对象 95
6.2 避免使用对象的浅拷贝 96
6.3 如何正确放置静态区位置 100
6.4 为什么不要使用静态引入 102
6.5 如何正确使用instanceof 103
6.6 避免实例化特有工具类 106
6.7 避免有深度耦合的类关系 107
优化技巧14:移动变量 110
优化技巧15:移动方法 112
6.8 如何为臃肿的类进行手术 114
优化技巧16:分解类 116
6.9 如何优化冗赘类 117
优化技巧17:合并类 118
6.10 避免在接口中出现实现代码 119
小结 120
第7章 如何正确使用异常 121
7.1 避免定义继承Error或Throwable子类 121
7.2 避免抛出RuntimeException或Exception 122
7.3 避免捕获NullPointerException或Error 124
7.4 避免在finally块中处理返回值 125
7.5 避免使失败失去原子性 127
7.6 如何对异常进行封装 128
优化技巧18:用异常代替错误码 129
7.7 将优雅的异常信息反馈给用户 130
7.8 避免乱用异常 131
小结 133
第8章 如何优化代码性能 134
8.1 避免在大量字符串拼接时用“+” 134
8.2 避免在循环体内生成临时对象 135
8.3 在频繁插入与删除时使用LinkedList 137
8.4 在文件操作后要进行清理动作 139
编程解密四:完美改造 140
8.5 避免显示调用finalized()方法 142
小结 143
第9章 架构优化 144
9.1 单一职责原则 144
优化技巧19:梳理并分解类职责 145
9.2 接口隔离原则 147
优化技巧20:隔离接口 149
9.3 依赖倒置原则 151
优化技巧21:提炼接口 152
9.4 里式替换原则 154
9.5 最少知道原则 155
9.6 如何扩展外部类功能 159
优化技巧22:引入本地扩展 160
9.7 如何梳理混杂的架构体系 160
优化技巧23:以委托代替继承 165
优化技巧24:封装向下转型 165
优化技巧25:提炼继承体系 167
优化技巧26:折叠继承体系 169
小结 170
第10章 包优化 172
10.1 发布等价原则 172
10.2 共同重用原则 173
10.3 共同封闭原则 174
10.4 无环依赖原则 176
10.5 如何保持包的清晰 179
优化技巧28:规整包中类位置 180
编程解密五:完美优化 181
10.6 如何抽出框架层次 182
10.7 如何提取框架工程 183
小结 189
第11章 优良代码风格 190
11.1 如何优化代码格式工具 190
11.2 如何统一标准的代码格式 193
11.3 养成良好的代码注释习惯 194
编程解密六:完美突破 196
小结 198
结束语 199
附录 200
参考文献 229