提交 dd3f8042 编写于 作者: W wizardforcel

2021-10-01 18:10:07

上级 0cd54010
......@@ -8,39 +8,39 @@
# 这本书涵盖的内容
第 1 章、*安装和对 Java 11*的一瞥,帮助您设置运行 Java 程序的开发环境,并简要介绍 Java 11 中的新功能和工具。
第 1 章、“安装和一瞥 Java 11”,帮助您设置运行 Java 程序的开发环境,并简要介绍 Java 11 中的新功能和工具。
第 2 章*OOP 快速通道——类和接口*,涵盖了面向对象编程(OOP)原理和设计解决方案,包括内部类、继承、组合、接口、枚举以及 Java 9 对 Javadocs 的更改。
第 2 章“OOP 快速通道——类和接口,涵盖了面向对象编程(OOP)原理和设计解决方案,包括内部类、继承、组合、接口、枚举以及 Java 9 对 Javadocs 的更改。
第 3 章*模块化编程*介绍了拼图作为 Java 生态系统的一个主要特性和巨大飞跃。本章将演示如何使用工具(如 JDEP 和 jlink)创建简单的模块化应用程序和相关工件(如模块化 JAR),以及如何模块化预 Jigsaw 应用程序。
第 3 章“模块化编程”介绍了拼图作为 Java 生态系统的一个主要特性和巨大飞跃。本章将演示如何使用工具(如 JDEP 和 jlink)创建简单的模块化应用程序和相关工件(如模块化 JAR),以及如何模块化预 Jigsaw 应用程序。
第 4 章*开始功能化*介绍了一种称为函数式编程的编程范式。所涵盖的主题包括函数接口、lambda 表达式和 lambda 友好的 api。
第 4 章“开始函数式”介绍了一种称为函数式编程的编程范式。所涵盖的主题包括函数接口、lambda 表达式和 lambda 友好的 api。
第 5 章*流和管道*展示了如何利用流和链接集合上的多个操作来创建管道,使用工厂方法创建集合对象,创建和操作流,以及在
第 5 章“流和管道”展示了如何利用流和链接集合上的多个操作来创建管道,使用工厂方法创建集合对象,创建和操作流,以及在
流上创建操作管道,包括并行计算。
第 6 章*数据库编程*涵盖了 Java 应用程序和数据库之间的基本和常用交互,从连接到数据库并执行 CRUD 操作到创建事务、存储过程以及处理大型对象
第 6 章“数据库编程”涵盖了 Java 应用程序和数据库之间的基本和常用交互,从连接到数据库并执行 CRUD 操作到创建事务、存储过程以及处理大型对象
第 7 章、*并发和多线程编程*介绍了合并并发的不同方式以及一些最佳实践,如同步和不变性。本章还讨论了一些常用模式的实现,例如使用 Java 提供的构造进行分治和发布-订阅。
第 7 章、“并发和多线程编程”介绍了合并并发的不同方式以及一些最佳实践,如同步和不变性。本章还讨论了一些常用模式的实现,例如使用 Java 提供的构造进行分治和发布-订阅。
第 8 章*操作系统流程的更好管理*详细阐述了流程 API 的新 API 增强。
第 8 章“操作系统进程的更好管理”详细阐述了流程 API 的新 API 增强。
第 9 章*使用 Spring Boot 的 RESTful Web 服务*介绍了使用 Spring Boot 创建简单的 RESTful Web 服务,将其部署到 Heroku,对接基于 Spring Boot 的 RESTful Web 服务应用程序,以及使用 Prometheus 监控 Spring Boot 应用程序。
第 9 章“使用 Spring Boot 的 RESTful Web 服务”介绍了使用 Spring Boot 创建简单的 RESTful Web 服务,将其部署到 Heroku,对接基于 Spring Boot 的 RESTful Web 服务应用程序,以及使用 Prometheus 监控 Spring Boot 应用程序。
第 10 章、*组网*展示了如何使用不同的 HTTP 客户端 API 库;即,最新 JDK 附带的新 HTTP 客户端 API、Apache HTTP 客户端和 Unirest HTTP 客户端 API。
第 10 章、“网络”展示了如何使用不同的 HTTP 客户端 API 库;即,最新 JDK 附带的新 HTTP 客户端 API、Apache HTTP 客户端和 Unirest HTTP 客户端 API。
第 11 章*内存管理和调试*探讨了 Java 应用程序的内存管理,包括介绍 Java 9 中使用的垃圾收集算法,以及一些有助于高级应用程序诊断的新功能。我们还将展示如何通过使用新的 try-with-resources 构造和新的 stack-walking API 来管理资源。
第 11 章“内存管理和调试”探讨了 Java 应用程序的内存管理,包括介绍 Java 9 中使用的垃圾收集算法,以及一些有助于高级应用程序诊断的新功能。我们还将展示如何通过使用新的 try-with-resources 构造和新的 stack-walking API 来管理资源。
第 12 章*使用 JShell*的读取-评估打印循环(REPL)向您展示了如何使用作为 JDK 一部分提供的新 REPL 工具和 JShell。
第 12 章“使用 JShell 的读取-评估打印循环(REPL)”向您展示了如何使用作为 JDK 一部分提供的新 REPL 工具和 JShell。
第 13 章*使用新的日期和时间 API*演示了如何构造时区相关和独立的日期和时间实例,如何在日期实例之间创建基于日期和时间的时段,如何表示历元时间,如何操作和比较日期和时间实例,如何使用不同的日历系统,以及如何使用`DateTimeFormatter`设置日期格式。
第 13 章“使用新的日期和时间 API*演示了如何构造时区相关和独立的日期和时间实例,如何在日期实例之间创建基于日期和时间的时段,如何表示历元时间,如何操作和比较日期和时间实例,如何使用不同的日历系统,以及如何使用`DateTimeFormatter`设置日期格式。
第 14 章*测试*解释了如何在 API 与其他组件集成之前对其进行单元测试,包括使用一些虚拟数据的存根依赖和模拟依赖。我们还将向您展示如何编写 fixture 来填充测试数据,以及如何通过集成不同的 api 并测试它们来测试您的应用程序行为。
第 14 章“测试”解释了如何在 API 与其他组件集成之前对其进行单元测试,包括使用一些虚拟数据的存根依赖和模拟依赖。我们还将向您展示如何编写 fixture 来填充测试数据,以及如何通过集成不同的 api 并测试它们来测试您的应用程序行为。
第 15 章*使用 Java 10 和 Java 11*进行编码的新方法,演示了如何使用局部变量类型推断,以及何时和如何使用局部变量语法进行 lambda 参数。
第 15 章“使用 Java 10 和 Java 11 进行编码的新方法”,演示了如何使用局部变量类型推断,以及何时和如何使用局部变量语法进行 lambda 参数。
第 16 章*使用 JavaFX*进行 GUI 编程,说明如何使用 JavaFX 使用 FXML 标记和 CSS 创建 GUI。它将演示如何创建条形图、饼图、折线图和面积图。它还将展示如何在应用程序和媒体源中嵌入 HTML,以及如何向控件添加效果。此外,我们还将在 OpenJFX11 更新中了解最新发布的机器人 API。
第 16 章“使用 JavaFX 的 GUI 编程”,说明如何使用 JavaFX 使用 FXML 标记和 CSS 创建 GUI。它将演示如何创建条形图、饼图、折线图和面积图。它还将展示如何在应用程序和媒体源中嵌入 HTML,以及如何向控件添加效果。此外,我们还将在 OpenJFX11 更新中了解最新发布的机器人 API。
# 充分利用这本书
......@@ -111,7 +111,7 @@ $16 ==> 599
# 小节
在这本书中,你会发现几个经常出现的标题(*准备就绪**如何做……**如何工作……**还有更多……**另见*。要明确说明如何完成配方,请使用以下部分:
在这本书中,你会发现几个经常出现的标题(“准备”、“操作步骤”、“工作原理”、“更多”、“另见”。要明确说明如何完成配方,请使用以下部分:
# 准备
......
......@@ -73,7 +73,7 @@ JDK 提供的工具,即`javac`、`java`、`jconsole`和`jlink`,可在 JDK
# 怎么做。。。
1. 按照*在 Windows 上安装 JDK 18.9 并设置路径变量*配方的步骤 1 和步骤 2 进入下载页面。
1. 按照“在 Windows 上安装 JDK 18.9 并设置路径变量”配方的步骤 1 和步骤 2 进入下载页面。
2. 从下载页面复制 Linux x64 平台 JDK 的下载链接(`tar.gz`
3. 使用`$> wget <copied link>`下载 JDK,例如`$> wget https://download.java.net/java/early_access/jdk11/26/BCL/jdk-11-ea+26_linux-x64_bin.tar.gz`
......@@ -154,7 +154,7 @@ public class HelloWorldXml{
}
```
我们将在第三章、*模块化编程*中详细介绍模块。但这个示例只是让您体验一下模块化编程,并测试您的 JDK 安装。
我们将在第三章、“模块化编程”中详细介绍模块。但这个示例只是让您体验一下模块化编程,并测试您的 JDK 安装。
包含上述文件的目录结构如下所示:
......@@ -179,7 +179,7 @@ public class HelloWorldXml{
<messages><message>Hello World in XML</message></messages>
```
如果您无法理解通过`java``javac`命令传递的选项,请不要担心。您将在第 3 章、*模块化编程*中了解它们。
如果您无法理解通过`java``javac`命令传递的选项,请不要担心。您将在第 3 章、“模块化编程”中了解它们。
# Java11 有什么新功能?
......@@ -191,13 +191,13 @@ Java9 的发布是 Java 生态系统中的一个里程碑。在 Jigsaw 项目下
Java10 发行版(JDK18.3)在每年 3 月和 9 月开始为期六个月的发行周期,并采用了新的发行编号系统。它还引入了许多新功能,其中(对于应用程序开发人员)最重要的功能如下:
* 允许使用保留的`var`类型声明变量的局部变量类型推断(参见第 15 章、*Java 10 和 Java 11 编码的新方式*
* 允许使用保留的`var`类型声明变量的局部变量类型推断(参见第 15 章、“Java 10 和 Java 11 编码的新方式”
* G1 垃圾回收器的并行完全垃圾回收,提高了最坏情况下的延迟
* 一种新方法`Optional.orElseThrow()`,现在是现有`get()`方法的首选替代方法
* 用于创建不可修改集合的新 API:`java.util`包的`List.copyOf()``Set.copyOf()``Map.copyOf()`方法以及`java.util.stream.Collectors`类的新方法:`toUnmodifiableList()``toUnmodifiableSet()``toUnmodifiableMap()`(参见第 5 章、*流和管道*
* 用于创建不可修改集合的新 API:`java.util`包的`List.copyOf()``Set.copyOf()``Map.copyOf()`方法以及`java.util.stream.Collectors`类的新方法:`toUnmodifiableList()``toUnmodifiableSet()``toUnmodifiableMap()`(参见第 5 章、“流和管道”
* 一组默认的根证书颁发机构,使 OpenJDK 构建对开发人员更具吸引力
* 一个新的 Javadoc 命令行选项`--add-stylesheet`支持在生成的文档中使用多个样式表
* 扩展现有的类数据共享功能,允许将应用程序类放置在共享存档中,从而缩短启动时间并减少占用空间(请参阅*使用应用程序类数据共享*配方)
* 扩展现有的类数据共享功能,允许将应用程序类放置在共享存档中,从而缩短启动时间并减少占用空间(请参阅“使用应用程序类数据共享”配方)
* 可以在 Linux/x64 平台上使用实验性即时编译器 Graal
* 一个干净的垃圾收集器(GC)接口,它使在不干扰当前代码库的情况下向热点添加新的 GC 变得更简单,并使从 JDK 构建中排除 GC 变得更容易
......@@ -218,21 +218,21 @@ Java10 发行版(JDK18.3)在每年 3 月和 9 月开始为期六个月的发
Epsilon 是一个所谓的无操作垃圾收集器,基本上什么也不做。它的用例包括性能测试、内存压力测试和虚拟机接口测试。它还可以用于短期作业或不消耗太多内存且不需要垃圾收集的作业。
我们在第 11 章、*内存管理和调试*中的*了解低开销垃圾收集器*配方中详细讨论了此功能。
我们在第 11 章、“内存管理和调试”中的“了解低开销垃圾收集器”配方中详细讨论了此功能。
# JEP 321–HTTP 客户端(标准)
JDK 18.9 标准化了 JDK 9 中引入并在 JDK 10 中更新的孵化 HTTP API 客户端。基于 CompletableFuture,它支持非阻塞请求和响应。新的实现是异步的,提供了更好的可跟踪数据流。
第 10 章*网络*在几个食谱中更详细地解释了这一特性。
第 10 章“网络”在几个食谱中更详细地解释了这一特性。
# JEP 323–Lambda 参数的局部变量语法
lambda 参数的局部变量语法与使用 Java11 中引入的保留`var`类型的局部变量声明的语法相同。详见第 15 章中的*对 lambda 参数使用局部变量语法*配方、*Java 10 和 Java 11 编码的新方式*
lambda 参数的局部变量语法与使用 Java11 中引入的保留`var`类型的局部变量声明的语法相同。详见第 15 章中的“对 lambda 参数使用局部变量语法”配方、“Java 10 和 Java 11 编码的新方式”
# JEP 333–ZGC
**Z 垃圾收集器****ZGC**是一个实验性的低延迟垃圾收集器。它的暂停时间不应超过 10 毫秒,与使用 G1 收集器相比,应用程序吞吐量减少不应超过 15%。ZGC 还为将来的特性和优化奠定了基础。Linux/x64 将是第一个获得 ZGC 支持的平台。
**Z 垃圾收集器****ZGC**是一个实验性的低延迟垃圾收集器。它的暂停时间不应超过 10 毫秒,与使用 G1 收集器相比,应用程序吞吐量减少不应超过 15%。ZGC 还为将来的特性和优化奠定了基础。Linux/x64 将是第一个获得 ZGC 支持的平台。
# 新 API
......@@ -347,7 +347,7 @@ JDK 18.9 中还引入了许多其他更改:
* Flight Recorder 提供了一个低开销的数据收集框架,用于对 Java 应用程序和 HotSpot JVM 进行故障排除
* Java 启动器现在可以运行作为单个 Java 源代码文件提供的程序,因此这些程序可以直接从源代码运行
* 通过 JVM 工具接口可以访问低开销堆评测,它提供了一种对 Java 堆分配进行采样的方法
* **传输层安全****TLS**1.3 增加了安全性并提高了性能
* **传输层安全****TLS**1.3 增加了安全性并提高了性能
*`java.lang.Character``java.lang.String``java.awt.font.NumericShaper``java.text.Bidi,java.text.BreakIterator``java.text.Normalizer`类中支持 Unicode 版本 10.0
阅读 Java11(JDK18.9)发行说明了解更多详细信息和其他更改。
......
......@@ -341,7 +341,7 @@ public static void main(String... arg) {
![](img/3b0f5b59-fcd0-4847-8141-cb56a9c81995.png)
如果接口只有一个抽象方法(称为函数接口),则可以使用另一个构造(称为*lambda 表达式*,而不是匿名内部类)。它提供了一个较短的表示法。我们将在第 4 章*开始功能化*中讨论功能接口和 lambda 表达式。
如果接口只有一个抽象方法(称为函数接口),则可以使用另一个构造(称为*lambda 表达式*,而不是匿名内部类)。它提供了一个较短的表示法。我们将在第 4 章“开始函数式”中讨论功能接口和 lambda 表达式。
# 还有更多。。。
......
......@@ -179,7 +179,7 @@ jdeps -jdkinternals -cp "classes/;lib/*"
![](img/5f7a9c3e-554a-46d7-b7fd-6920ddf9b0ae.png)
StackWalker API 是用于遍历调用堆栈的新 API,它是在 Java9 中引入的。这是对`sun.reflect.Reflection.getCallerClass()`方法的替代。我们将在第 11 章、*内存管理和调试*中讨论此 API。
StackWalker API 是用于遍历调用堆栈的新 API,它是在 Java9 中引入的。这是对`sun.reflect.Reflection.getCallerClass()`方法的替代。我们将在第 11 章、“内存管理和调试”中讨论此 API。
5. 让我们在 JAR 文件`sample.jar`上运行`jdeps`
......
......@@ -2273,7 +2273,7 @@ System.out.println(map2); //prints: {false=2, true=1}
# 准备
在上一章第 4 章*开始功能化*中,在创建一个 lambda 友好的 API 时,我们最终采用了以下 API 方法:
在上一章第 4 章“开始函数式”中,在创建一个 lambda 友好的 API 时,我们最终采用了以下 API 方法:
```java
public interface Traffic {
......
......@@ -424,7 +424,7 @@ l.add(i, "last");
这是因为尽管`List l`是同步的,但在多线程处理中,很可能其他代码会向列表中添加更多元素或删除元素。
并发问题不容易解决。这就是为什么越来越多的开发人员现在采取更激进的方法并不奇怪。他们宁愿在一组无状态操作中处理数据,而不是管理对象状态。我们在第 5 章、*流和管道*中看到了此类代码的示例。Java 和许多现代语言以及计算机系统似乎正朝着这个方向发展。
并发问题不容易解决。这就是为什么越来越多的开发人员现在采取更激进的方法并不奇怪。他们宁愿在一组无状态操作中处理数据,而不是管理对象状态。我们在第 5 章、“流和管道”中看到了此类代码的示例。Java 和许多现代语言以及计算机系统似乎正朝着这个方向发展。
# 作为实现并发的一种手段的不变性
......@@ -1548,7 +1548,7 @@ void invokeAnyCallables(ExecutorService execService,
这样的设计平衡了负载并允许有效地使用资源。
出于演示目的,我们将使用在第 3 章、*模块化编程*`TrafficUnit``SpeedModel``Vehicle`接口中创建的 API 以及`TrafficUnitWrapper``FactoryTraffic``FactoryVehicle``FactorySpeedModel`类。我们还将依赖于第 3 章、*模块化编程*中描述的流和流管道。
出于演示目的,我们将使用在第 3 章、“模块化编程”、`TrafficUnit``SpeedModel``Vehicle`接口中创建的 API 以及`TrafficUnitWrapper``FactoryTraffic``FactoryVehicle``FactorySpeedModel`类。我们还将依赖于第 3 章、“模块化编程”中描述的流和流管道。
为了提醒您,以下是`TrafficUnitWrapper`课程:
......@@ -1712,7 +1712,7 @@ void demo3_ForkJoin_invoke() {
当然,这是开始分而治之过程最流行的方式。
现在让我们回到`compute()`方法,看看如何实现它。首先,让我们实现`if`块(计算小于`threshold`车辆的平均速度)。我们将使用第 3 章、*模块化编程*中描述的技术和代码:
现在让我们回到`compute()`方法,看看如何实现它。首先,让我们实现`if`块(计算小于`threshold`车辆的平均速度)。我们将使用第 3 章、“模块化编程”中描述的技术和代码:
```java
double speed =
......
......@@ -44,7 +44,7 @@ SpringBoot 支持 Maven 和 Gradle 作为其构建工具,我们将在我们的
# 怎么做。。。
1. 如果您遵循了*准备就绪*部分中提到的组 ID 和工件 ID 命名约定,那么您将拥有一个包结构`com.packt.boot_demo`和一个已经为您创建的`BootDemoApplication.java`主类。在`tests`文件夹下将有一个等效的包结构和一个`BootDemoApplicationTests.java`主类。
1. 如果您遵循了“准备”部分中提到的组 ID 和工件 ID 命名约定,那么您将拥有一个包结构`com.packt.boot_demo`和一个已经为您创建的`BootDemoApplication.java`主类。在`tests`文件夹下将有一个等效的包结构和一个`BootDemoApplicationTests.java`主类。
2.`com.packt.boot_demo`包下创建一个新类`SimpleViewController`,代码如下:
......
......@@ -180,7 +180,7 @@ HttpResponse<String> response = client.send(request,
另外,注意模块定义`module-info.java`,可在`Chapter10/2_making_http_post/src/http.client.demo`中找到。
要了解 Jackson JARs 在该模块化代码中的使用方式,请参考第 3 章、*模块化编程*中的*自下而上迁移**自上而下迁移*配方。
要了解 Jackson JARs 在该模块化代码中的使用方式,请参考第 3 章、“模块化编程”中的*自下而上迁移**自上而下迁移*配方。
提供运行脚本`run.bat``run.sh`,以方便代码的编译和执行:
......@@ -438,7 +438,7 @@ String responseBody = client.execute(request, response -> {
# 准备
由于 Java 库不是模块化的,我们将使用自动模块的概念,如第 3 章、*模块化编程*中所述。属于库的 JAR 被放置在应用程序的模块路径上,然后应用程序通过使用 JAR 的名称作为其模块名来声明对 JAR 的依赖关系。这样,JAR 文件自动成为一个模块,因此称为自动模块。
由于 Java 库不是模块化的,我们将使用自动模块的概念,如第 3 章、“模块化编程”中所述。属于库的 JAR 被放置在应用程序的模块路径上,然后应用程序通过使用 JAR 的名称作为其模块名来声明对 JAR 的依赖关系。这样,JAR 文件自动成为一个模块,因此称为自动模块。
Java 库的 Maven 依赖项如下所示:
......
......@@ -467,7 +467,7 @@ jcmd Chapter11Memory VM.info
# 尝试使用资源以更好地处理资源
管理资源很重要。例如,任何错误处理(未释放)保持打开状态的资源数据库连接和文件描述符都可能耗尽系统的操作能力。这就是为什么在 JDK 7 中引入了*try with resources*语句。我们在第 6 章、*数据库编程*的示例中使用过:
管理资源很重要。例如,任何错误处理(未释放)保持打开状态的资源数据库连接和文件描述符都可能耗尽系统的操作能力。这就是为什么在 JDK 7 中引入了*try with resources*语句。我们在第 6 章、“数据库编程”的示例中使用过:
```java
try (Connection conn = getDbConnection();
......
......@@ -603,7 +603,7 @@ public void testGetSpeedMphException(){
模仿其他方法和类很简单。对接口进行编码(如第 2 章中所述,*对 OOP 的快速跟踪-类和接口*使其更加容易,尽管有模拟框架允许您模拟未实现任何接口的类(我们将在本配方的下一节中看到此类框架用法的示例)。此外,使用对象和方法工厂可以帮助您创建此类工厂的特定于测试的实现,以便它们可以使用返回预期硬编码值的方法生成对象。
例如,在第 4 章、*开始功能化*中,我们引入了`FactoryTraffic`,它产生了`TrafficUnit`的一个或多个对象。在实际系统中,该工厂将从某个外部系统提取数据。使用真实系统作为源代码可能会使代码设置复杂化。如您所见,为了解决这个问题,我们模拟了数据,根据与真实数据有点相似的分布生成数据:汽车比卡车多一点,车辆重量取决于汽车类型,乘客数量和有效载荷重量,等等。对于这种模拟来说,重要的是值的范围(最小值和最大值)应该反映来自真实系统的值,因此应用程序将在可能的真实数据的整个范围内进行测试。
例如,在第 4 章、“开始函数式”中,我们引入了`FactoryTraffic`,它产生了`TrafficUnit`的一个或多个对象。在实际系统中,该工厂将从某个外部系统提取数据。使用真实系统作为源代码可能会使代码设置复杂化。如您所见,为了解决这个问题,我们模拟了数据,根据与真实数据有点相似的分布生成数据:汽车比卡车多一点,车辆重量取决于汽车类型,乘客数量和有效载荷重量,等等。对于这种模拟来说,重要的是值的范围(最小值和最大值)应该反映来自真实系统的值,因此应用程序将在可能的真实数据的整个范围内进行测试。
模拟代码的重要限制是它不应该太复杂。否则,它的维护将需要开销,这将降低团队生产力或降低测试覆盖率。
......@@ -1129,9 +1129,9 @@ public class DatabaseRelatedTest {
# 它是如何工作的。。。
这种用法的一个典型示例是在运行第一个测试方法之前创建必要的表,并在测试类的最后一个方法完成之后删除它们。设置/清理方法也可用于创建/关闭数据库连接,除非您的代码在“资源试用”构造中执行此操作(请参阅第 11 章、*内存管理和调试*
这种用法的一个典型示例是在运行第一个测试方法之前创建必要的表,并在测试类的最后一个方法完成之后删除它们。设置/清理方法也可用于创建/关闭数据库连接,除非您的代码在“资源试用”构造中执行此操作(请参阅第 11 章、“内存管理和调试”
这里是一个夹具使用的示例(参考第 6 章、*数据库编程*,了解*如何设置数据库以运行它的更多信息,*部分)。假设我们需要测试`DbRelatedMethods`类:
这里是一个夹具使用的示例(参考第 6 章、“数据库编程”,了解*如何设置数据库以运行它的更多信息,*部分)。假设我们需要测试`DbRelatedMethods`类:
```java
class DbRelatedMethods{
......@@ -1255,7 +1255,7 @@ private DbRelatedMethods dbRelatedMethods = new DbRelatedMethods();
应用程序的整体基础架构由`process`文件夹中的类支持:`Dispatcher``Processor``Subscription`。我们在第 7 章、*并发多线程编程*中讨论并演示了它们的功能。这些类允许分发处理。
`Dispatcher`类使用`Subscription`类向池中`Processors`的填充发送处理请求。每个`Processor`类根据请求执行任务(使用`AverageSpeed``TraffciDensity`类),并将结果存储在数据库中(基于第 6 章、*数据库编程*中讨论的功能,使用`utils`文件夹中的`DbUtil`类)。
`Dispatcher`类使用`Subscription`类向池中`Processors`的填充发送处理请求。每个`Processor`类根据请求执行任务(使用`AverageSpeed``TraffciDensity`类),并将结果存储在数据库中(基于第 6 章、“数据库编程”中讨论的功能,使用`utils`文件夹中的`DbUtil`类)。
我们已经将这些类中的大多数作为单元进行了测试。现在,我们将集成它们,并作为一个整体测试应用程序的正确行为。
......@@ -1414,7 +1414,7 @@ public class TrafficDensity {
}
```
我们还引入了一个静态属性,以便在所有类实例之间保持相同的数据库连接。否则,连接池应该非常大,因为正如您在第 7 章、*并发和多线程编程*中回忆的那样,并行执行任务的工作人员数量随着要做的工作量的增加而增加。
我们还引入了一个静态属性,以便在所有类实例之间保持相同的数据库连接。否则,连接池应该非常大,因为正如您在第 7 章、“并发和多线程编程”中回忆的那样,并行执行任务的工作人员数量随着要做的工作量的增加而增加。
如果您查看`DbUtils`,您将看到一种新方法,该方法创建了`data`表,用于保存`FactoryTraffic`中的`TrafficUnits``data_common`表,该表保存了用于数据请求和计算的主要参数:请求的交通单元数、交通数据的日期和地理位置、时间(以秒为单位)(计算速度时的点)和每条车道的速度限制(其大小定义了我们在建模交通时计划使用的车道数)。以下是我们配置用于进行记录的代码:
......
......@@ -267,7 +267,7 @@ ageCalculator.setOnAction((event) -> {
});
```
前面的语法看起来类似于 Swing 期间广泛使用的匿名内部类。您可以在第 4 章、*开始功能化*中的配方中了解更多关于功能接口和 lambda 表达式的信息。
前面的语法看起来类似于 Swing 期间广泛使用的匿名内部类。您可以在第 4 章、“开始函数式”中的配方中了解更多关于功能接口和 lambda 表达式的信息。
在我们的事件处理代码中,我们分别使用`getText()``getValue()`方法从`nameField``dateOfBirthPicker`获取值。`DatePicker`返回选择作为`java.time.LocalDate`实例的日期。这是添加到 Java8 中的新日期时间 API 之一。它表示一个日期,即年、月和日,没有任何时区相关信息。然后,我们使用`java.time.Period`类查找当前日期和所选日期之间的持续时间,如下所示:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册