提交 7939075d 编写于 作者: W wizardforcel

2021-10-01 23:29:38

上级 f76a81cc
......@@ -200,7 +200,7 @@ class Z extends X, Y
}
```
在前面的代码片段中,我们有`X``Y`类以及其中的一些数据字段或方法。`Z`类继承`X``Y`类。允许这样做吗?答案是否定的。java 不允许多个继承,而 C++ 则允许。因此,在这里,我们可以得出结论,前面的代码片段是不正确的,将抛出一个错误。
在前面的代码片段中,我们有`X``Y`类以及其中的一些数据字段或方法。`Z`类继承`X``Y`类。允许这样做吗?答案是否定的。Java 不允许多个继承,而 C++ 则允许。因此,在这里,我们可以得出结论,前面的代码片段是不正确的,将抛出一个错误。
这也是继承和接口之间的区别之一,因为接口允许我们一次使用多个接口。
......
......@@ -12,9 +12,9 @@
第 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 章“流和管道”展示了如何利用流和链接集合上的多个操作来创建管道,使用工厂方法创建集合对象,创建和操作流,以及在
流上创建操作管道,包括并行计算。
......@@ -36,7 +36,7 @@
第 13 章“使用新的日期和时间 API*”演示了如何构造时区相关和独立的日期和时间实例,如何在日期实例之间创建基于日期和时间的时段,如何表示历元时间,如何操作和比较日期和时间实例,如何使用不同的日历系统,以及如何使用`DateTimeFormatter`设置日期格式。
第 14 章“测试”解释了如何在 API 与其他组件集成之前对其进行单元测试,包括使用一些虚拟数据的桩依赖和模拟依赖。我们还将向您展示如何编写夹具来填充测试数据,以及如何通过集成不同的 api 并测试它们来测试您的应用程序行为。
第 14 章“测试”解释了如何在 API 与其他组件集成之前对其进行单元测试,包括使用一些虚拟数据的桩依赖和模拟依赖。我们还将向您展示如何编写夹具来填充测试数据,以及如何通过集成不同的 API 并测试它们来测试您的应用程序行为。
第 15 章“使用 Java 10 和 Java 11 进行编码的新方法”,演示了如何使用局部变量类型推断,以及何时和如何使用局部变量语法进行 Lambda 参数。
......
......@@ -9,9 +9,9 @@
* 自底向上迁移
* 自上而下迁移
* 使用服务在使用者和提供者模块之间创建松散耦合
* 使用 jlink 创建自定义模块化运行时映像
* 使用 JLink 创建自定义模块化运行时映像
* 为较旧的平台版本编译
* 创建多版本 jar
* 创建多版本 JAR
* 使用 Maven 开发模块化应用程序
* 使库模块路径友好
* 如何打开模块进行反射
......@@ -213,7 +213,7 @@ StackWalker API 是用于遍历调用堆栈的新 API,它是在 Java9 中引
没有输出,这意味着我们的代码不依赖于`java.util.concurrent`包。
7. 我们只希望对代码运行依赖项检查。是的,这是可能的。假设我们运行`jdeps -cp lib/* sample.jar`;您甚至会看到正在分析的库 jar。我们不想那样,对吧?让我们只包括`com.packt`包的类:
7. 我们只希望对代码运行依赖项检查。是的,这是可能的。假设我们运行`jdeps -cp lib/* sample.jar`;您甚至会看到正在分析的库 JAR。我们不想那样,对吧?让我们只包括`com.packt`包的类:
```java
# On Linux
......@@ -615,7 +615,7 @@ ModuleStatement:
# 准备
我们已经在“创建更简单的模块化应用程序”配方中看到并创建了一个简单的模块化应用程序。为了构建模块化 JAR,我们将使用`Chapter03/3_modular_jar`中提供的示例代码。此示例代码包含两个模块:`math.util``calculator`。我们将为这两个模块创建模块化 jar
我们已经在“创建更简单的模块化应用程序”配方中看到并创建了一个简单的模块化应用程序。为了构建模块化 JAR,我们将使用`Chapter03/3_modular_jar`中提供的示例代码。此示例代码包含两个模块:`math.util``calculator`。我们将为这两个模块创建模块化 JAR
# 怎么做。。。
......@@ -698,7 +698,7 @@ math.util@1.0
# 准备
对于这个配方,我们需要一个模块化的 jar 和一个非模块化的应用程序。我们的模块化代码可以在`Chapter03/4_modular_jar_with_pre_java9/math.util`中找到(这与我们在“创建简单模块化应用程序”配方中创建的`math.util`模块相同)。让我们编译此模块化代码,并使用以下命令创建模块化 JAR:
对于这个配方,我们需要一个模块化的 JAR 和一个非模块化的应用程序。我们的模块化代码可以在`Chapter03/4_modular_jar_with_pre_java9/math.util`中找到(这与我们在“创建简单模块化应用程序”配方中创建的`math.util`模块相同)。让我们编译此模块化代码,并使用以下命令创建模块化 JAR:
```java
javac -d classes --module-source-path . $(find math.util -name *.java)
......@@ -872,14 +872,14 @@ math.util.jar -> java.base
}
```
3.`6_bottom_up_migration_after`文件夹中,通过运行以下命令编译模块的 java 代码:
3.`6_bottom_up_migration_after`文件夹中,通过运行以下命令编译模块的 Java 代码:
```java
javac -d mods --module-source-path src
$(find src -name *.java)
```
4. 您将看到模块`banking.util`中的 java 代码被编译到 mods 目录中。
4. 您将看到模块`banking.util`中的 Java 代码被编译到 mods 目录中。
5. 让我们为这个模块创建一个模块化 JAR:
```java
......@@ -1028,9 +1028,9 @@ java --add-modules ALL-MODULE-PATH --module-path ../6_bottom_up_migration_after/
另一种迁移技术是自顶向下迁移。在这种方法中,我们从 JAR 依赖关系图中的根 JAR 开始。
jar 表示一个代码基。我们假设代码库是以 JAR 的形式提供的,因此我们得到的依赖关系图具有节点,即 JAR。
JAR 表示一个代码基。我们假设代码库是以 JAR 的形式提供的,因此我们得到的依赖关系图具有节点,即 JAR。
模块化依赖关系图的根意味着这个根所依赖的所有其他 jar 都必须是模块化的。否则,此模块根不能声明对未命名模块的依赖关系。让我们考虑一下我们在自底向上迁移方法中引入的示例非模块化应用程序。依赖关系图如下所示:
模块化依赖关系图的根意味着这个根所依赖的所有其他 JAR 都必须是模块化的。否则,此模块根不能声明对未命名模块的依赖关系。让我们考虑一下我们在自底向上迁移方法中引入的示例非模块化应用程序。依赖关系图如下所示:
![](img/90299e09-6b9c-4e5e-a65f-e6e31db6158d.png)
......@@ -1225,7 +1225,7 @@ $ java -cp calculator/out/classes:calculator/lib/*:math_util/out/math.util.jar:b
有了这个,我们已经完全模块化了应用程序,展示了我们已经转换为自动模块的 Jackson 库。
我们更喜欢自上而下的迁移方法。这是因为我们不必同时处理类路径和模块路径。我们可以将所有内容都制作成自动模块,然后在将非模块化 jar 迁移到模块化 jar 时使用模块路径。
我们更喜欢自上而下的迁移方法。这是因为我们不必同时处理类路径和模块路径。我们可以将所有内容都制作成自动模块,然后在将非模块化 JAR 迁移到模块化 JAR 时使用模块路径。
# 使用服务在使用者和提供者模块之间创建松散耦合
......@@ -1417,7 +1417,7 @@ $ java -cp calculator/out/classes:calculator/lib/*:math_util/out/math.util.jar:b
前两行打印可用服务提供商的类名,第三行打印我们正在使用的`BookService`实现。
# 使用 jlink 创建自定义模块化运行时映像
# 使用 JLink 创建自定义模块化运行时映像
Java 有两种风格:
......@@ -1490,7 +1490,7 @@ Java9 中引入了一个名为`jlink`的新工具,它支持创建模块化运
# 为较旧的平台版本编译
我们在某个时候使用了`-source``-target`选项来创建 java 构建。`-source`选项用于指示编译器接受的 Java 语言版本,`-target`选项用于指示类文件支持的版本。通常,我们忘记使用`-source`选项,默认情况下,`javac`根据最新的可用 Java 版本进行编译。因此,有可能会使用较新的 API,因此,构建不会在目标版本上按预期运行。
我们在某个时候使用了`-source``-target`选项来创建 Java 构建。`-source`选项用于指示编译器接受的 Java 语言版本,`-target`选项用于指示类文件支持的版本。通常,我们忘记使用`-source`选项,默认情况下,`javac`根据最新的可用 Java 版本进行编译。因此,有可能会使用较新的 API,因此,构建不会在目标版本上按预期运行。
为了克服提供两个不同命令行选项的混乱,Java9 中引入了一个新的命令行选项`--release`。此选项可替代`-source``-target``-bootclasspath`选项。`-bootclasspath`用于提供给定版本`N`的引导类文件的位置。
......@@ -1537,7 +1537,7 @@ key3, value3
您可以看到,我们使用的是`--release`选项,目标是 Java 8,而不是编译`module-info.java`
2. 让我们创建一个 JAR 文件,因为传输 java 构建比复制所有类文件更容易:
2. 让我们创建一个 JAR 文件,因为传输 Java 构建比复制所有类文件更容易:
```java
$jar --create --file mlib/demo.jar --main-class
......@@ -1618,7 +1618,7 @@ com/packt/CollectionsDemo has been compiled by a more recent version of the Java
编译为目标旧版本所需的数据存储在`$JDK_ROOT/lib/ct.sym`文件中。此信息由`--release`选项用于定位`bootclasspath``ct.sym`文件是一个 ZIP 文件,包含与目标平台版本的类文件相对应的精简类文件(逐字取自[这里](http://openjdk.java.net/jeps/247))。
# 创建多版本 jar
# 创建多版本 JAR
在 Java9 之前,如果不发布新的库版本,库的开发人员很难采用该语言中引入的新特性。但在 Java9 中,多版本 JAR 提供了这样一种功能,您可以将某些类文件捆绑在一起,以便在使用更高版本的 Java 时运行。
......@@ -1675,7 +1675,7 @@ com/packt/CollectionsDemo has been compiled by a more recent version of the Java
javac -d mods9 --release 9 src9compackt*.java
```
记下用于编译不同 java 版本代码的`--release`选项。
记下用于编译不同 Java 版本代码的`--release`选项。
4. 现在,让我们创建多版本 JAR:
......@@ -1762,7 +1762,7 @@ Multi-Release: true
* `mongodb.book.service`:此模块为服务提供商接口提供实现
* `sqldb.book.service`:此模块为服务提供商接口提供另一个实现
在这个过程中,我们将创建一个 maven 项目,并将前面的 JDK 模块作为 maven 模块包括在内。让我们开始吧。
在这个过程中,我们将创建一个 Maven 项目,并将前面的 JDK 模块作为 Maven 模块包括在内。让我们开始吧。
# 怎么做。。。
......@@ -1929,7 +1929,7 @@ mvn clean install
对于一个完全模块化的应用程序,它应该将自身及其依赖项模块化。现在,制作第三方模块不在应用程序开发人员的手中。一种方法是在模块路径中包含第三方`jar`,并使用`jar`的名称作为模块的名称来声明依赖关系。在这种情况下,`jar`成为一个自动模块。这是可以的,但通常情况下,`jar`的名称对模块名不友好,或者不符合有效模块名的语法。在这种情况下,我们使用 JDK 9 中添加的另一个支持,其中可以在`jar``MANIFEST.mf`文件中定义`jar`的名称,然后库使用者可以声明对定义名称的依赖关系。这样,在将来,库开发人员可以模块化他们的库,同时仍然使用相同的模块名。
在本配方中,我们将向您展示如何为从非模块化`jar`创建的自动模块提供名称。首先,我们将向您展示如何使用 maven 实现这一点,然后在“更多”部分,我们将了解如何在不使用任何构建工具的情况下创建 JAR。
在本配方中,我们将向您展示如何为从非模块化`jar`创建的自动模块提供名称。首先,我们将向您展示如何使用 Maven 实现这一点,然后在“更多”部分,我们将了解如何在不使用任何构建工具的情况下创建 JAR。
# 准备
......@@ -2037,7 +2037,7 @@ Automatic-Module-Name: com.packt.banking
让我们复制在“如何做”中创建的`jar`文件。。。部分,您可以在`13_automatic_module\target\13_automatic_module-1.0.jar`中找到,放入`13_using_automatic_module\mods`文件夹中。这使得我们即将推出的模块化应用程序能够利用`jar`附带的`com.packt.banking`模块。
复制 jar 后,我们需要为我们的模块创建一个模块定义,并在`module-info.java`中声明其依赖项,放在`13_using_automatic_module\src\banking.demo`中:
复制 JAR 后,我们需要为我们的模块创建一个模块定义,并在`module-info.java`中声明其依赖项,放在`13_using_automatic_module\src\banking.demo`中:
```java
module banking.demo{
......
......@@ -114,7 +114,7 @@ G1 GC 从年轻一代集合开始,使用停止世界进行疏散(将年轻
如您所见,它创建了 99888999 个对象并将它们添加到`List<AnObject> list`集合中。您可以通过减少最大对象数(`max`来调整它,以匹配计算机的配置。
2. g1gc 是自 java9 以来的默认收集器,因此,如果它对您的应用程序足够好,则不必设置任何内容。不过,您可以通过在命令行上提供`-XX:+UseG1GC`来显式启用 G1:
2. g1gc 是自 Java9 以来的默认收集器,因此,如果它对您的应用程序足够好,则不必设置任何内容。不过,您可以通过在命令行上提供`-XX:+UseG1GC`来显式启用 G1:
```java
java -XX:+UseG1GC -cp ./cookbook-1.0.jar
......
# 测试
本章介绍如何测试应用程序如何捕获和自动测试用例,如何在 API 与其他组件集成之前对其进行单元测试,以及如何集成所有单元。我们将向您介绍**行为驱动开发****BDD**),并展示它如何成为您应用程序开发的起点。我们还将演示 JUnit 框架如何用于单元测试。有时,在单元测试期间,我们必须使用一些虚拟数据来插桩依赖项,这可以通过模拟依赖项来完成。我们将向您展示如何使用模拟库来实现这一点。我们还将向您展示如何编写夹具来填充测试数据,以及如何通过集成不同的 api 并将它们测试在一起来测试应用程序的行为。我们将介绍以下配方:
本章介绍如何测试应用程序如何捕获和自动测试用例,如何在 API 与其他组件集成之前对其进行单元测试,以及如何集成所有单元。我们将向您介绍**行为驱动开发****BDD**),并展示它如何成为您应用程序开发的起点。我们还将演示 JUnit 框架如何用于单元测试。有时,在单元测试期间,我们必须使用一些虚拟数据来插桩依赖项,这可以通过模拟依赖项来完成。我们将向您展示如何使用模拟库来实现这一点。我们还将向您展示如何编写夹具来填充测试数据,以及如何通过集成不同的 API 并将它们测试在一起来测试应用程序的行为。我们将介绍以下配方:
* 黄瓜行为测试
* 使用 JUnit 对 API 进行单元测试
......
......@@ -30,7 +30,7 @@
Adobe 还为桌面引入了富 internet 应用程序运行时环境,称为**Adobe AIR**,允许在桌面上运行 Flex 应用程序。这是对由来已久的 Swing API 的重大打击。但让我们回到市场:2009 年,Sun Microsystems 推出了一款名为**JavaFX**的产品。该框架受 Flex(使用 XML 定义 UI)的启发,并引入了自己的脚本语言**JavaFXScript**,这有点接近 JSON 和 JavaScript。您可以从 JavaFX 脚本调用 JavaAPI。引入了一种新的体系结构,它有一个新的窗口工具包和一个新的图形引擎。它是 Swing 更好的替代方案,但它有一个缺点,开发人员必须学习 JavaFX 脚本来开发基于 JavaFX 的应用程序。除了 Sun Microsystems 无法在 JavaFX 和 Java 平台上进行更多投资外,一般来说,JavaFX 从未像预想的那样起飞。
Oracle(在收购 Sun Microsystems 之后)宣布了新的 JavaFX 版本 2.0,这是对 JavaFX 的完全重写,从而消除了脚本语言,使 JavaFX 成为 Java 平台中的 API。这使得使用 javafxapi 与使用 swingapi 类似。此外,还可以在 Swing 中嵌入 JavaFX 组件,从而使基于 Swing 的应用程序更具功能性。从那时起,JavaFX 就不再回头了。
Oracle(在收购 Sun Microsystems 之后)宣布了新的 JavaFX 版本 2.0,这是对 JavaFX 的完全重写,从而消除了脚本语言,使 JavaFX 成为 Java 平台中的 API。这使得使用 JavaFXAPI 与使用 swingAPI 类似。此外,还可以在 Swing 中嵌入 JavaFX 组件,从而使基于 Swing 的应用程序更具功能性。从那时起,JavaFX 就不再回头了。
JavaFX 不再与 jdk11 绑定(既不是 oraclejdk,也不是 OpenJDK 构建)。而且它也不再与 OpenJDK10 版本捆绑在一起。[它们必须从 OpenJFX 项目页面单独下载](https://wiki.openjdk.java.net/display/OpenJFX/Main)[OpenJFX](https://openjfx.io/) 的新社区网站已经发布。
......@@ -187,7 +187,7 @@ java -p "PATH_TO_JAVAFX_SDK_LIB:COMPILED_CODE" <other parts of the command line>
stage.show();
```
11. 现在我们需要从 main 方法启动这个 javafxui。我们使用`Application`类的`launch(String[] args)`方法来启动 JavaFXUI:
11. 现在我们需要从 main 方法启动这个 JavaFXui。我们使用`Application`类的`launch(String[] args)`方法来启动 JavaFXUI:
```java
public static void main(String[] args) {
......@@ -536,7 +536,7 @@ Pane pane = (Pane)loader.load(getClass()
使用不同 CSS 文件的优点是,我们可以独立地改变网页的外观,而不必与元素的位置紧密耦合。此外,这还鼓励跨不同页面重用 CSS 属性,从而使它们在所有页面上都具有统一的外观。
当我们对 JavaFX 应用类似的方法时,我们可以利用 Web 设计师已经掌握的 CSS 知识为 JavaFX 组件构建 CSS,这有助于比使用 javaapi 更容易地设计组件的样式。当这个 CSS 与 FXML 混合使用时,它就成为 Web 开发人员已知的领域。
当我们对 JavaFX 应用类似的方法时,我们可以利用 Web 设计师已经掌握的 CSS 知识为 JavaFX 组件构建 CSS,这有助于比使用 JavaAPI 更容易地设计组件的样式。当这个 CSS 与 FXML 混合使用时,它就成为 Web 开发人员已知的领域。
在本食谱中,我们将介绍使用外部 CSS 文件设计一些 JavaFX 组件的样式。
......@@ -856,7 +856,7 @@ java -p "PATH_TO_JAVAFX_SDK_LIB:COMPILED_CODE" <other parts of the command line>
我们已经创建了一个用于处理学生文件的模块。模块名称为`student.processor`,其代码可在`Chapter16/101_student_data_processor`找到。因此,如果您想更改那里的任何代码,您可以通过运行`build-jar.bat``build-jar.sh`文件来重建 JAR。这将在`mlib`目录中创建一个模块化 JAR`student.processor.jar`。然后,你必须用这个配方的`mlib`目录中的一个,即`Chapter16/4_bar_charts/mlib`来替换这个模块化JAR。
我们建议您从`Chapter16/101_student_data_processor`中提供的源代码构建`student.processor`模块化 jar。我们提供了`build-jar.bat``build-jar.sh`脚本来帮助您构建 JAR。您只需运行与平台相关的脚本,然后将`101_student_data_processor/mlib`中的 jar 构建复制到`4_bar_charts/mlib`
我们建议您从`Chapter16/101_student_data_processor`中提供的源代码构建`student.processor`模块化 JAR。我们提供了`build-jar.bat``build-jar.sh`脚本来帮助您构建 JAR。您只需运行与平台相关的脚本,然后将`101_student_data_processor/mlib`中的 JAR 构建复制到`4_bar_charts/mlib`
这样,我们可以在所有涉及图表的配方中重用此模块。
......@@ -1089,9 +1089,9 @@ java -p "PATH_TO_JAVAFX_SDK_LIB;COMPILED_CODE" <other parts of the command line>
java -p "PATH_TO_JAVAFX_SDK_LIB:COMPILED_CODE" <other parts of the command line>
```
我们将使用我们在“创建一个条形图”配方中讨论过的相同的学生数据(从机器学习库中获取并在我们这里处理)。为此,我们创建了一个模块`student.processor`,它将读取学生数据并向我们提供`Student`对象列表。模块的源代码可在`Chapter16/101_student_data_processor`中找到。我们已经为本配方代码的`Chapter16/5_pie_charts/mlib`处的`student.processor`模块提供了模块化 jar
我们将使用我们在“创建一个条形图”配方中讨论过的相同的学生数据(从机器学习库中获取并在我们这里处理)。为此,我们创建了一个模块`student.processor`,它将读取学生数据并向我们提供`Student`对象列表。模块的源代码可在`Chapter16/101_student_data_processor`中找到。我们已经为本配方代码的`Chapter16/5_pie_charts/mlib`处的`student.processor`模块提供了模块化 JAR
我们建议您从`Chapter16/101_student_data_processor`中提供的源代码构建`student.processor`模块化 jar。我们提供了`build-jar.bat``build-jar.sh`脚本来帮助您构建 jar。您只需运行与平台相关的脚本,然后将`101_student_data_processor/mlib`中的 jar 构建复制到`4_bar_charts/mlib`
我们建议您从`Chapter16/101_student_data_processor`中提供的源代码构建`student.processor`模块化 JAR。我们提供了`build-jar.bat``build-jar.sh`脚本来帮助您构建 JAR。您只需运行与平台相关的脚本,然后将`101_student_data_processor/mlib`中的 JAR 构建复制到`4_bar_charts/mlib`
# 怎么做。。。
......
......@@ -129,7 +129,7 @@ pipeline {
Travis CI 的配置使用名为`.Travis.yaml`的文件完成。此文件的内容使用不同的关键字进行结构化,包括:
* `language`:项目语言,即 java、node_js、ruby、python 或 php 等(完整列表见[这里](https://docs.travis-ci.com/user/languages/)
* `language`:项目语言,即 Java、node_js、ruby、python 或 php 等(完整列表见[这里](https://docs.travis-ci.com/user/languages/)
* `sudo`:设置是否需要超级用户权限的标志值(例如安装 Ubuntu 软件包)。
* `dist`:构建可以在 Linux 环境(UbuntuPrecise 12.04 或 UbuntuTrusty 14.04)上执行。
* `addons`:apt get 命令基本操作的声明性快捷方式。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册