Java 14是非 LTS。
考虑到 6 个月发布的新版本序列,并且 8 和 11 是 LTS,Java 14 不应该是下一个 LTS 版本吗?
还是纯粹基于 Java 架构师来决定他们为 LTS 选择哪个?
我确实在网上搜索过,但找不到答案。
recordJDK 14 中引入的预览功能 (JEP 384) 是一项伟大的创新。它们使创建简单的不可变类变得更加容易,这些类是纯粹的值集合,而不会丢失各种库中通用元组类中固有的上下文。
由 Brian Goetz ( https://openjdk.java.net/jeps/384 )编写的 JEP 描述很好地解释了意图。然而,我期待与最终引入的值类型有更密切的联系。值类型的最初目标是相当广泛的:通过消除这些类型的对象不需要的所有开销(例如引用间接、同步),本质上允许对那些值最重要的对象进行潜在的显着性能改进。此外,它还可以提供句法细节,例如myPosition != yourPosition代替!myPosition.equals(yourPosition).
似乎记录的限制与潜在值类型所需的限制类型非常接近。然而,JEP 在动机中没有提及这些目标。我试图找到有关这些审议的任何公开记录,但没有成功。
所以我的问题是:记录是否旨在成为可能向值类型转变的一部分,还是这些完全不相关的概念和未来的值类型可能看起来完全不同?
我提出这个问题的动机是:如果记录成为语言的永久部分,那么如果在未来的版本中可能会带来显着的性能优势,那么在代码中采用它们将是一个额外的动力。
我喜欢Lombok项目,但最近我正在阅读并尝试 Java 14 的一些新功能。
在新功能中,有一个record关键字,它允许创建一个已经内置以下功能的类:构造函数、私有 final 字段、访问器、equals/hashCode、getter、toString 方法。
现在我的问题是:是更好地依赖 Lombok 的功能还是应该开始使用记录功能:
最好使用这个:
record Person (String name, String surname) {}
Run Code Online (Sandbox Code Playgroud)
或者那个:
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class Person {
@Getter private int name;
@Getter private int surname;
}
Run Code Online (Sandbox Code Playgroud)
这两种方法的优缺点是什么?
Java SE 14 引入的重要特性之一是Helpful NullPointerExceptions,它与NullPointerException. 是什么让NullPointerExceptionJava SE 14 比它的前身更有用?
我们有一个客户端应用程序(经过 10 多年的开发)。它的 JDK 最近从 OpenJDK 11 升级到了 OpenJDK 14。在单 CPU(禁用超线程)的 Windows 10 设置(以及只有一个可用 CPU 的 VirtualBox 机器内)上,与 Java 11 相比,应用程序启动速度相当慢。此外,它大部分时间使用 100% 的 CPU。我们还可以通过将处理器关联设置为仅一个 CPU ( c:\windows\system32\cmd.exe /C start /affinity 1 ...)来重现该问题。
在我的 VirtualBox 机器中以最少的手动交互启动应用程序和执行查询的一些测量:
-XX:-UseBiasedLocking:46 秒-XX:-ThreadLocalHandshakes:40 秒-XX:-UseBiasedLocking:3-3.5 分钟只更改了使用的 JDK(和提到的选项)。(-XX:-ThreadLocalHandshakes在 Java 14 中不可用。)
我们尝试记录 JDK 14 对-Xlog:all=debug:file=app.txt:uptime,tid,level,tags:filecount=50 …
Java 14@Serial在java.io包中引入了一个新的注解。它在 API 文档中的简要说明:
Indicates that an annotated field or method is part of the serialization mechanism defined by the Java Object Serialization Specification.
As far as I understand the annotation is used for the compile-time validation (similarly to @Override) to check whether the serialization mechanism methods and fields are used correctly. What I don't understand, does the annotation affect the de/serialization itself as long as it is a part of the serialization mechanism? …
我正在阅读Records的文档, 但不理解“浅不可变”一词。我们所说的浅不可变是什么意思?如果它是不可变的,为什么我们需要一个复制构造函数?为什么有两个“Hello World!”?
对于所有记录类,以下不变量必须成立:如果记录 R 的组件是 c1、c2、... cn,那么如果记录实例被复制如下:
R copy = new R(r.c1(), r.c2(), ..., r.cn()); // copy constructor ?
Run Code Online (Sandbox Code Playgroud)
那么一定是这样的r.equals(copy)。
Java 14 引入了记录功能。Record 创建与字段同名的 getter,因此可以编写print(person.name())例如。但是旧的 Java bean 约定规定应该将此方法命名为getName().
在同一个代码库中使用这两种样式看起来不太好。将所有内容迁移到记录是不可能的,因为它们太有限而无法替换所有用例。
是否有任何官方或半官方指南如何在新代码中以 Java 14 命名 getter 和 setter?
应该如何记录Java Record参数?我指的是最终成为构造函数参数、类字段的参数。
我试过:
/**
* @param name the name of the animal
* @param age the age of the animal
*/
public record Animal(String name, int age)
{
}
Run Code Online (Sandbox Code Playgroud)
但 IntelliJ IDEA 将@params标记为错误。我找不到有关这应该如何工作的在线示例。我发现的最接近的讨论是https://bugs.openjdk.java.net/browse/JDK-8225055。
我发现JDK 中的一些单元 测试似乎暗示这应该有效。也许这是一个IDE错误?
我使用的是 OpenJDK 14+36-1461,IDEA 2020.1。
以防万一,我针对 IDEA提交了错误报告。
假设以下示例:
public record SomeRecord(int foo, byte bar, long baz)
{ }
Run Code Online (Sandbox Code Playgroud)
我是否需要覆盖hashCode,equals如果我要将所述对象添加到 a 中HashMap?