Author:[英]Benjamin J. Evans [荷兰]Martijn Verburg [Verburg, Benjamin J. Evans Martijn]
No description
Tags
Support Statistics
¥.00 ·
0times
Text Preview (First 20 pages)
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
Page
1
更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
2
版权信息 书名:Java程序员修炼之道 作者:Benjamin J. Evans, Martijn Verburg 译者:吴海星 ISBN:978-7-115-32195-4 本书由北京图灵文化发展有限公司发行数字版。版权所有,侵权必 究。 您购买的图灵电子书仅供您个人使用,未经授权,不得以任何方式复 制和传播本书内容。 我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产 权。 如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该 帐号等维权措施,并可能追究法律责任。 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
3
目录 版权声明 序 前言 致谢 关于本书 阅读须知 读者对象 路线图 代码约定及下载 软件需求 作者在线 关于作者 关于封面图片 第一部分 用Java 7做开发 第1章 初识Java 7 1.1 语言与平台 1.2 Coin项目:浓缩的都是精华 1.3 Coin项目中的修改 1.3.1 switch语句中的String 1.3.2 更强的数值文本表示法 1.3.3 改善后的异常处理 1.3.4 Try-with-resources(TWR) 1.3.5 钻石语法 1.3.6 简化变参方法调用 1.4 小结 第2章 新I/O 2.1 Java I/O简史 2.1.1 Java 1.0到1.3 2.1.2 在Java 1.4中引入的NIO 2.1.3 下一代I/O-NIO.2 2.2 文件I/O的基石:Path 2.2.1 创建一个Path 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
4
2.2.2 从Path中获取信息 2.2.3 移除冗余项 2.2.4 转换Path 2.2.5 NIO.2 Path和Java已有的File类 2.3 处理目录和目录树 2.3.1 在目录中查找文件 2.3.2 遍历目录树 2.4 NIO.2的文件系统I/O 2.4.1 创建和删除文件 2.4.2 文件的复制和移动 2.4.3 文件的属性 2.4.4 快速读写数据 2.4.5 文件修改通知 2.4.6 SeekableByteChannel 2.5 异步 I/O操作 2.5.1 将来式 2.5.2 回调式 2.6 Socket和Channel的整合 2.6.1 NetworkChannel 2.6.2 MulticastChannel 2.7 小结 第二部分 关键技术 第3章 依赖注入 3.1 知识注入:理解IoC和DI 3.1.1 控制反转 3.1.2 依赖注入 3.1.3 转成DI 3.2 Java中标准化的DI 3.2.1 @Inject注解 3.2.2 @Qualifier注解 3.2.3 @Named注解 3.2.4 @Scope注解 3.2.5 @Singleton注解 3.2.6 接口Provider<T> 3.3 Java中的DI参考实现:Guice 3 3.3.1 Guice新手指南 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
5
3.3.2 水手绳结:Guice的各种绑定 3.3.3 在Guice中限定注入对象的生命周期 3.4 小结 第4章 现代并发 4.1 并发理论简介 4.1.1 解释Java线程模型 4.1.2 设计理念 4.1.3 这些原则如何以及为何会相互冲突 4.1.4 系统开销之源 4.1.5 一个事务处理的例子 4.2 块结构并发(Java 5之前) 4.2.1 同步与锁 4.2.2 线程的状态模型 4.2.3 完全同步对象 4.2.4 死锁 4.2.5 为什么是synchronized 4.2.6 关键字volatile 4.2.7 不可变性 4.3 现代并发应用程序的构件 4.3.1 原子类:java.util.concurrent.atomic 4.3.2 线程锁:java.util.concurrent.locks 4.3.3 CountDownLatch 4.3.4 ConcurrentHashMap 4.3.5 CopyOnWriteArrayList 4.3.6 Queue 4.4 控制执行 4.4.1 任务建模 4.4.2 ScheduledThreadPoolExecutor 4.5 分支/合并框架 4.5.1 一个简单的分支/合并例子 4.5.2 ForkJoinTask与工作窃取 4.5.3 并行问题 4.6 Java内存模型 4.7 小结 第5章 类文件与字节码 5.1 类加载和类对象 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
6
5.1.1 加载和连接:概览 5.1.2 验证 5.1.3 Class对象 5.1.4 类加载器 5.1.5 示例:依赖注入中的类加载器 5.2 使用方法句柄 5.2.1 MethodHandle 5.2.2 MethodType 5.2.3 查找方法句柄 5.2.4 示例:反射、代理与方法句柄 5.2.5 为什么选择MethodHandle 5.3 检查类文件 5.3.1 介绍javap 5.3.2 方法签名的内部形式 5.3.3 常量池 5.4 字节码 5.4.1 示例:反编译类 5.4.2 运行时环境 5.4.3 操作码介绍 5.4.4 加载和储存操作码 5.4.5 数学运算操作码 5.4.6 执行控制操作码 5.4.7 调用操作码 5.4.8 平台操作操作码 5.4.9 操作码的快捷形式 5.4.10 示例:字符串拼接 5.5 Invokedynamic 5.5.1 invokedynamic如何工作 5.5.2 示例:反编译invokedynamic调用 5.6 小结 第6章 理解性能调优 6.1 性能术语 6.1.1 等待时间 6.1.2 吞吐量 6.1.3 利用率 6.1.4 效率 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
7
6.1.5 容量 6.1.6 扩展性 6.1.7 退化 6.2 务实的性能分析法 6.2.1 知道你在测量什么 6.2.2 知道怎么测量 6.2.3 知道性能目标是什么 6.2.4 知道什么时候停止优化 6.2.5 知道高性能的成本 6.2.6 知道过早优化的危险 6.3 哪里出错了?我们担心的原因 6.3.1 过去和未来的性能趋势:摩尔定律 6.3.2 理解内存延迟层级 6.3.3 为什么Java性能调优存在困难 6.4 一个来自于硬件的时间问题 6.4.1 硬件时钟 6.4.2 麻烦的nanoTime() 6.4.3 时间在性能调优中的作用 6.4.4 案例研究:理解缓存未命中 6.5 垃圾收集 6.5.1 基本算法 6.5.2 标记和清除 6.5.3 jmap 6.5.4 与GC相关的JVM参数 6.5.5 读懂GC日志 6.5.6 用VisualVM查看内存使用情况 6.5.7 逸出分析 6.5.8 并发标记清除 6.5.9 新的收集器:G1 6.6 HotSpot的JIT编译 6.6.1 介绍HotSpot 6.6.2 内联方法 6.6.3 动态编译和独占调用 6.6.4 读懂编译日志 6.7 小结 第三部分 JVM上的多语言编程 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
8
第7章 备选JVM语言 7.1 Java 太笨?纯粹诽谤 7.1.1 整合系统 7.1.2 函数式编程的基本原理 7.1.3 映射与过滤器 7.2 语言生态学 7.2.1 解释型与编译型语言 7.2.2 动态与静态类型 7.2.3 命令式与函数式语言 7.2.4 重新实现的语言与原生语言 7.3 JVM上的多语言编程 7.3.1 为什么要用非Java语言 7.3.2 崭露头角的语言新星 7.4 如何挑选称心的非Java语言 7.4.1 低风险 7.4.2 与Java的交互操作 7.4.3 良好的工具和测试支持 7.4.4 备选语言学习难度 7.4.5 使用备选语言的开发者 7.5 JVM对备选语言的支持 7.5.1 非Java语言的运行时环境 7.5.2 编译器小说 7.6 小结 第8章 Groovy:Java的动态伴侣 8.1 Groovy入门 8.1.1 编译和运行 8.1.2 Groovy控制台 8.2 Groovy 101:语法和语义 8.2.1 默认导入 8.2.2 数字处理 8.2.3 变量、动态与静态类型、作用域 8.2.4 列表和映射语法 8.3 与Java的差异——新手陷阱 8.3.1 可选的分号和返回语句 8.3.2 可选的参数括号 8.3.3 访问限定符 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
9
8.3.4 异常处理 8.3.5 Groovy中的相等 8.3.6 内部类 8.4 Java不具备的Groovy特性 8.4.1 GroovyBean 8.4.2 安全解引用操作符 8.4.3 猫王操作符 8.4.4 增强型字符串 8.4.5 函数字面值 8.4.6 内置的集合操作 8.4.7 对正则表达式的内置支持 8.4.8 简单的XML处理 8.5 Groovy与Java的合作 8.5.1 从Groovy调用Java 8.5.2 从Java调用Groovy 8.6 小结 第9章 Scala:简约而不简单 9.1 走马观花Scala 9.1.1 简约的Scala 9.1.2 match表达式 9.1.3 case类 9.1.4 actor 9.2 Scala能用在我的项目中吗 9.2.1 Scala和Java的比较 9.2.2 何时以及如何开始使用Scala 9.2.3 Scala可能不适合当前项目的迹象 9.3 让代码因Scala重新绽放 9.3.1 使用编译器和REPL 9.3.2 类型推断 9.3.3 方法 9.3.4 导入 9.3.5 循环和控制结构 9.3.6 Scala的函数式编程 9.4 Scala对象模型:相似但不同 9.4.1 一切皆对象 9.4.2 构造方法 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
10
9.4.3 特质 9.4.4 单例和伴生对象 9.4.5 case类和match表达式 9.4.6 警世寓言 9.5 数据结构和集合 9.5.1 List 9.5.2 Map 9.5.3 泛型 9.6 actor介绍 9.6.1 代码大舞台 9.6.2 用mailbox跟actor通信 9.7 小结 第10章 Clojure:更安全地编程 10.1 Clojure介绍 10.1.1 Clojure的Hello World 10.1.2 REPL入门 10.1.3 犯了错误 10.1.4 学着去爱括号 10.2 寻找Clojure:语法和语义 10.2.1 特殊形式新手营 10.2.2 列表、向量、映射和集 10.2.3 数学运算、相等和其他操作 10.3 使用函数和循环 10.3.1 一些简单的Clojure函数 10.3.2 Clojure中的循环 10.3.3 读取器宏和派发器 10.3.4 函数式编程和闭包 10.4 Clojure序列 10.4.1 懒序列 10.4.2 序列和变参函数 10.5 Clojure与Java的互操作 10.5.1 从Clojure中调用Java 10.5.2 Clojure值的Java类型 10.5.3 使用Clojure代理 10.5.4 用REPL做探索式编程 10.5.5 在Java中使用Clojure 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
11
10.6 Clojure并发 10.6.1 未来式与并行调用 10.6.2 ref形式 10.6.3 代理 10.7 小结 第四部分 多语种项目开发 第11章 测试驱动开发 11.1 TDD概览 11.1.1 一个测试用例 11.1.2 多个测试用例 11.1.3 深入思考红—绿—重构循环 11.1.4 JUnit 11.2 测试替身 11.2.1 虚设对象 11.2.2 存根对象 11.2.3 伪装替身 11.2.4 模拟对象 11.3 ScalaTest 11.4 小结 第12章 构建和持续集成 12.1 与Maven 3相遇 12.2 Maven 3入门项目 12.3 用Maven 3构建Java7developer项目 12.3.1 POM 12.3.2 运行示例 12.4 Jenkins:满足CI需求 12.4.1 基础配置 12.4.2 设置任务 12.4.3 执行任务 12.5 Maven和Jenkins代码指标 12.5.1 安装Jenkins插件 12.5.2 用Checkstyle保持代码一致性 12.5.3 用FindBugs设定质量标杆 12.6 Leiningen 12.6.1 Leiningen入门 12.6.2 Leiningen的架构 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
12
12.6.3 Hello Lein 12.6.4 用Leiningen做面向REPL的TDD 12.6.5 用Leiningen打包和部署 12.7 小结 第13章 快速Web开发 13.1 Java Web框架的问题 13.1.1 Java编译为什么不好 13.1.2 静态类型为什么不好 13.2 选择Web框架的标准 13.3 Grails入门 13.4 Grails快速启动项目 13.4.1 创建域对象 13.4.2 测试驱动开发 13.4.3 域对象持久化 13.4.4 创建测试数据 13.4.5 控制器 13.4.6 GSP/JSP页面 13.4.7 脚手架和UI的自动化创建 13.4.8 快速周转的开发 13.5 深入Grails 13.5.1 日志 13.5.2 GORM:对象关系映射 13.5.3 Grails插件 13.6 Compojure入门 13.6.1 Hello Compojure 13.6.2 Ring和路由 13.6.3 Hiccup 13.7 我是不是一只水獭 13.7.1 项目设置 13.7.2 核心函数 13.8 小结 第14章 保持优秀 14.1 对Java 8的期待 14.1.1 lambda表达式(闭包) 14.1.2 模块化(拼图Jigsaw) 14.2 多语言编程 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
13
14.2.1 语言的互操作性及元对象协议 14.2.2 多语言模块化 14.3 未来的并发趋势 14.3.1 多核的世界 14.3.2 运行时管理的并发 14.4 JVM的新方向 14.4.1 VM的合并 14.4.2 协同程序 14.4.3 元组 14.5 小结 附录A java7developer:源码安装 A.1 java7developer的源码结构 A.2 下载并安装Maven A.3 构建java7developer A.3.1 一次性的构建准备工作 A.3.2 clean A.3.3 compile A.3.4 test A.4 小结 附录B glob模式语法及示例 B.1 glob模式语法 B.2 glob模式示例 附录C 安装备选JVM语言 C.1 Groovy C.1.1 下载Groovy C.1.2 安装Groovy C.2 Scala C.3 Clojure C.4 Grails C.4.1 下载Grails C.4.2 安装Grails 附录D Jenkins的下载和安装 D.1 下载Jenkins D.2 安装Jenkins D.2.1 运行WAR文件 D.2.2 安装WAR文件 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
14
D.2.3 安装独立安装包 D.2.4 Jenkins的首次运行 附录E java7developer:Maven POM E.1 构建配置 E.2 依赖项管理 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
15
版权声明 Original English language edition, entitled The Well-Grounded Java Developer: Vital Techniques of Java 7 and Polyglot Programming by Benjamin J. Evans, Martijn Verburg, published by Manning Publications. 178 South Hill Drive, Westampton, NJ 08060 USA. Copyright © 2013 by Manning Publications. Simplified Chinese-language edition copyright © 2013 by Posts & Telecom Press. All rights reserved. 本书中文简体字版由Manning Publications授权人民邮电出版社独家 出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。 版权所有,侵权必究。 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
16
序 “Kirk说加油站也卖啤酒。”这是Ben Evans跟我说的第一句话。他来 克里特岛参加一个开放型Java会议。我说我通常到加油站就是加油, 但那边拐角确实有个店卖啤酒。Ben看起来对我的回答有点儿失望。我 在这个希腊小岛上生活了5年,还从来没在加油站买过啤酒。 当我在看这本书时,那种似曾相识的感觉又来了。我自认为是一名 Java专家:用Java写了15年程序,发表了几百篇文章,在各种会议中 演讲,还执教Java高级课程。可阅读Ben和Martijn的这本大作,经常 能给我一些意料之外的启发。他们一开始先介绍了为改变Java生态系 统所做的开发工作。类库的内部实现修改起来相对容易,一般也能见 到成效。例如,Arrays.sort()的内部实现在Java 7中不再用 MergeSort算法,而是改用了TimSort。由于这个变化,你不用修改自 己对偏序数组进行排序的代码就可能看到性能的提升。然而,修改类 文件格式或添加新的VM特性则需要大量工作。Ben了解这些情况,因为 他在JCP执行委员会任职。这本书也是关于Java 7的,所以你能接触到 Java 7中的所有新特性,比如语法糖的完善、String上的switch、 分支/合并,还有Java NIO.2。 并发就是线程和同步,对吗?如果这就是你对多线程的认识,那么你 需要学习新知识了。就像作者在书中指出的,“并发领域的研究工作 正开展得热火朝天”。与并发相关的邮件列表上每天都有讨论,新点 子层出不穷。本书会告诉你如何看待分而治之策略以及如何规避某些 安全陷阱。 在我看到类加载那一章时,我觉得他们说得有点儿过了。那都是我和 朋友们过去用来炫耀的技巧,居然也给摆出来供大家研习了!他们讲 解了javap(这个小工具用于透视Java编译器生成的字节码)的工作 方式,还谈到了新的invokedynamic指令,并解释了它跟普通反射的 区别。 我特别喜欢讲性能调优的第6章。除了Jack Shirazi的Java Performance Tuning,这还是第一本能够抓住“如何使系统运行更 快”这个本质问题的书。我可以用四个字来总结这一章的内容:“测 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
17
量,别猜。”这是做好性能调优的本质,因为人们不可能猜到运行慢 的是哪段代码。这一章从硬件的角度解读了性能方面的问题,而不是 只提供编码技巧。作者还向你展示了如何测量性能。有一个挺有意思 的基础测试小工具——CacheTester类,可用于查看缓存未命中时的 开销。 本书第三部分介绍了JVM上的多语言编程。Java不仅仅是Java编程语 言,它还是一个可以运行其他语言的平台。我们已经见过不同类型语 言的爆炸式增长了。有些是函数式的,有些是声明式的,还有一些是 平台的接口(Jython和JRuby),让其他语言可以在JVM上运行。语言 分为动态的(如Groovy)和静态的(如Java和Scala)。在JVM上我们 可能因为多种原因而使用非Java的语言。如果正好要开始一个新项 目,在做决定之前先看看都有什么可用吧。你可能不用再写那么多套 路化的代码了。 Ben和Martijn向我们介绍了三种备选语言:Groovy、Scala和 Clojure。在我看来,它们是当下最切实可行的选择。作者描述了这些 语言之间的差异、与Java的差异以及它们的特性。不需要太多的技术 细节,介绍每种语言的各章足以帮你弄清楚应该用哪一种。别指望能 在书中看到Groovy的参考手册,但你会了解哪种语言更适合你。 之后,你将深入了解如何进行测试驱动开发以及如何持续集成系统。 我发现一件很有意思的事,忠实的“老管家”Hudson这么快就被 Jenkins取代了。无论如何,这些工具跟Checkstyle和FindBugs一样都 是项目管理的基本工具。 你有望通过研读本书成为一名优秀的Java开发人员。不仅如此,你还 能了解如何保持优秀。Java一直在变。下一版中我们将见到lambda表 达式和模块化。1人们也在不断设计新语言,不断更新并发结构。你现 在了解的很多真相将来可能不再是真相。因此,我们必须活到老学到 老! 1 实现Java模块化的Jigsaw项目被延后到Java 9了,至少要到2015年。——译者注 一天,我又开车路过Ben想买啤酒的那个加油站。在经济状况如此低迷 的希腊,它也像很多公司一样关张了。我再也不可能知道他们卖不卖 啤酒了。 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
18
Heinz Kabutz博士 知名Java技术教育家、The Java Specialists' Newsletter创始人 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
19
前言 本书最开始是给德意志银行外汇IT部的新人准备的培训笔记。Ben觉得 市面上没有面向经验匮乏的Java开发人员的书,所以决定写一本来填 补这个空白。 在德意志银行IT管理团队的支持下,Ben去了比利时的Devoxx会议寻找 灵感。在那里他见到了IBM的三位工程师(Rob Nicholson、Zoe Slattery和Holly Cummins),他们把他引荐给了伦敦Java社区 (LJC,伦敦Java用户组)。 接下来的周六正好是LJC组织的年度开放会议,就在那次会议上,Ben 遇到了LJC的一位领导者——Martijn Verburg。两人一见如故,把酒 言欢,惺惺相惜,大有相见恨晚之意。也正是两人对技术和教学的共 同热爱促成了本书。 软件开发是一项社会活动,我们希望能借助本书唱响这一主题。我们 认为,虽然在这项活动中技术占有很重要的地位,但人与人之间微妙 的沟通和交互关系也不容忽视。要在书里轻松解释这些东西并不容 易,但这一主题自始至终贯穿本书。 凭借着对技术的执着和对学习的热爱,开发人员孜孜不倦地工作着。 我们希望本书讨论的一些话题能够激发他们的学习热情。这是一次观 光之旅,而不是百科全书式的灌输,这就是我们的初衷:帮助你入 门,然后让你自己去探索那些激发你想象力的东西。 本书不仅为大学毕业生准备了接引指南,更为所有心有困惑的Java开 发人员提供了指导。因为他们都很想知道:“接下来我该学什么?未来 要向什么方向发展?我要再好好考虑考虑!” 从Java 7的新特性到现代软件开发的最佳实践,再到平台的未来发 展,本书一路向前,向你展示在成长为资深Java开发人员的过程中我 们认为至关重要的那些知识。并发、性能、字节码和类加载是最让我 们着迷的核心技术。我们还会谈到JVM上那些新的非Java语言(即多语 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Page
20
言编程),因为在接下来的几年里,对于很多开发人员来说它们将变 得越来越重要。 归根结底,这是一次以你和你的兴趣为核心的、具有前瞻性的旅程。 我们认为成为一名优秀的Java开发人员有助于你彻底投入到工作中去 并顺利驾驭开发,也有助于你对不断变化的Java世界及它的周边生态 系统有更多了解。 我们希望这本“经验的结晶”对你来说既实用又有趣,希望它能让你 深思,同时还能带给你快乐。无论如何,写这本书的体验确实如此! 更多电子书资料请搜索「书行天下」:http://www.sxpdf.com
Comments 0
Loading comments...
Reply to Comment
Edit Comment