问题标签 [java-16]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1240 浏览

java - Intellij IDEA 2020.3.3 中 Switch 的 Java 16 模式匹配问题(预期表达式)

正如我们所知,Java 16 带来了诸如记录、密封接口和类以及模式匹配等新特性。

今天我想在我的培训项目中使用它们。但是,我遇到了一个问题,也许我不明白一些事情。

因此,在代表我的 Intellij Idea 项目的给定代码中,情况看起来像:我有包:客户端和订单客户端类是具有三个实现的密封接口:Regular、Vip 和 SuperVip:

Order 类是一个简单的聚合,从 DDD 知道:但是 switch 语句有一个问题:

其他类:

我得到“(预期表达)”我哪里出错了?(启用了实验功能,我已经安装了Java 16 open jdk)

在此处输入图像描述

在此处输入图像描述

0 投票
2 回答
1914 浏览

java - 如何将@ConfigurationProperties 与记录一起使用?

Java 16 引入了Records,这有助于在编写携带不可变数据的类时减少样板代码。当我尝试@ConfigurationProperties按如下方式使用 Record 作为 bean 时,我收到以下错误消息:

我如何将记录用作@ConfigurationProperties

0 投票
3 回答
1093 浏览

java - 为什么 Java Records 有访问器方法而不是公共的 final 字段?

JEP-395

记录类自动获取许多标准成员:

  • 对于header中的每个组件,有两个成员:一个与组件同名和返回类型的公共访问器方法,以及一个与组件同类型的私有final字段;

如果生成的最终字段与访问器方法具有相同的名称,为什么不生成公共最终字段呢?


由于记录类的实例可以序列化和反序列化,因此记录组件几乎不会被仔细更改。但是,无法通过提供 writeObject、readObject、readObjectNoData、writeExternal 或 readExternal 方法来自定义流程

所以改变 API 内部实现(记录组件)不是一个合适的理由。但我从@Brian Goetz那里得到了充分的理由

谢谢大家关注我的傻问题

0 投票
2 回答
730 浏览

java - 同一个 .java 文件中的多条记录

我们总是可以在一个 .java 文件中包含多个类。考虑到封装和每个类都包含多行代码,在 1 个 .java 文件中包含 1 个类(不要谈论嵌套类)总是有意义的。

现在记录开始发挥作用,它们可以少至 1 行代码。将多条记录封装在同一个 .java 类中是否有意义?

例如我们可以有

DTO.java文件将包含

如果没有记录具有公共访问修饰符,那么我们可以将它们全部包含在一个名为DTO.java的文件中

在我看来,拥有 3 个 .java 文件,每个文件中只有 1 行代码似乎不是很好。

但是,我们仍然会遇到类似这里描述的问题,同一个 java 文件中的多个类

0 投票
2 回答
828 浏览

java - Gradle Ktlint 插件在 Java 16 上失败

升级到 Java 16 后,我无法使 ktlint gradle 插件工作。它在扔

我知道这是由更严格的模块检查(JEP 396)引起的,但我无法为插件设置 JVM 参数。我试过了:

  • 设置环境变量JAVA_OPTS=--illegal-access=warn
  • 设置org.gradle.jvmargs=--illegal-access=warn -Dkotlin.daemon.jvm.options=--illegal-access=warn_gradle.properties

但是这两种尝试都没有帮助,我没有想法。

0 投票
1 回答
145 浏览

java - 使用 Java 16 时 Tomcat 未找到 Spring 初始化程序类

我有一个非常简单的 Gradle ( 7.0-rc-1) 脚本来使用嵌入式 Tomcat 实例初始化单个 Spring 5“hello world”端点。原始代码取自我在互联网上找到的一个随机示例。我的示例 Gradle 项目可以在这里找到。

我不确定它是如何工作的,但是 Web 服务器以某种方式知道WebApplicationInitializer.onStartup(ServletContext)在启动时调用该方法,以便初始化 Spring。

这在 Java 8 上可以正常工作;但是当我将 Gradle 构建定义中的以下工具链规范更改为 Java 16 时失败。

使用 Java 8 时,Spring 已正确初始化并且端点可以正常工作。

使用 Java 16 时,onStartup()不会调用该方法,因此 Spring 没有初始化并且端点不起作用(尽管 Tomcat 仍然启动并响应错误)。

日志显示一条​​消息,但没有堆栈跟踪:

我需要做什么才能在 Java 16 上进行这项工作?

注意我不想用spring-boot,请不要推荐。

0 投票
3 回答
630 浏览

android - 无法启动新的 React Native 项目。卡了一段时间请帮助(无法编译设置文件settings.gradle)

我的 SSD 坏了,所以我不得不重新开始。现在我被困在设置中。我非常仔细地按照 React 本地环境设置一步一步进行操作,在此之前我安装了 Java 16。现在,当我尝试启动新项目时,我初始化了这就是我得到的:

0 投票
1 回答
225 浏览

java - 为什么 Stream#toList 的默认实现看起来过于复杂/次优?

查看 的实现Stream#toList,我只是注意到它看起来是多么的过于复杂和次优。

就像上面的 javadoc 中提到的那样default,大多数实现都没有使用这个Stream实现,但是,在我看来,它可能不是这样。

来源

我的想法会更好

甚至

IntelliJ 的提议

在 JDK 源代码中实现有什么好的理由吗?

0 投票
1 回答
14160 浏览

java - java.lang.ExceptionInInitializerError 与 Java-16 | jlClassFormatError 可访问:模块 java.base 不会“打开 java.lang”到未命名的模块

cglib在 Maven 项目中具有传递依赖项。尽管添加了我认为正确的内容,但--add-opens我无法让该库与 Java 16 一起使用。

如何cglib使用 Java 16?我在 github 页面上提出了这个问题。

最小的可重现示例:

Main.java

使用 Java 15:

javac -cp cglib-3.3.0.jar Main.java

java --add-opens java.base/java.lang=ALL-UNNAMED -cp cglib-3.3.0.jar:asm-7.1.jar:. Main

使用 Java 16:

javac -cp cglib-3.3.0.jar Main.java

java --add-opens java.base/java.lang=ALL-UNNAMED -cp cglib-3.3.0.jar:asm-7.1.jar:. Main

0 投票
3 回答
948 浏览

java - 如何使用 Java 记录断言 hasProperty?

我在测试中有一段代码使用 Hamcrest 2.2 检查结果列表是否包含某些属性:

NameDto这在正常上课时效果很好。但是在我将其更改为 a 之后Record,HamcresthasProperty抱怨没有名为的属性name

我可以使用其他匹配器来实现与以前相同的匹配吗?或者我可以使用其他一些解决方法来让它与记录一起使用?