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)
这两种方法的优缺点是什么?
我正在阅读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)。
我正在尝试做类似下面的事情。
@Entity
@Table(name="Sample")
public record Sample(Integer id, String name) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="user_id")
private Integer id;
@Column(name="username")
private String name;
}
Run Code Online (Sandbox Code Playgroud)
但是,它给我错误“记录中不允许用户声明的非静态字段 id”,名称字段也相同。
有没有办法将新的java功能“记录”与JPA注释一起使用?
Java 14 引入了记录功能。Record 创建与字段同名的 getter,因此可以编写print(person.name())例如。但是旧的 Java bean 约定规定应该将此方法命名为getName().
在同一个代码库中使用这两种样式看起来不太好。将所有内容迁移到记录是不可能的,因为它们太有限而无法替换所有用例。
是否有任何官方或半官方指南如何在新代码中以 Java 14 命名 getter 和 setter?
我最近发现了 Java记录,了解它们的存在和用途真是太神奇了。
然而,我开始怀疑它们是否本质上只是幕后的类。
这是否意味着在编译过程中,它们会被转换为具有最终私有字段、公共构造函数和必要的 getter 的显式类?
应该如何记录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?
我有一个记录,想向它添加默认构造函数。
public record Record(int recordId) {
public Record {
}
}
Run Code Online (Sandbox Code Playgroud)
但它用int参数创建了构造函数。
public final class Record extends java.lang.Record {
private final int recordId;
public Record(int);
//other method
}
Run Code Online (Sandbox Code Playgroud)
我们如何向记录添加默认构造函数?
假设我有这样的记录(或任何其他记录):
record X(int i, int j) {
X(int i) {
this(i, 0);
}
X() {
this(0, 0);
}
X(String i, String j) {
this(Integer.parseInt(i), Integer.parseInt(j));
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法通过反射找到这条记录的规范构造函数,即在RecordHeader?
java ×10
java-record ×10
java-14 ×7
getter ×2
java-16 ×1
javadoc ×1
jpa ×1
lombok ×1
record ×1
reflection ×1
spring-boot ×1