标签: java-record

Java 记录是否旨在最终成为值类型?

recordJDK 14 中引入的预览功能 (JEP 384) 是一项伟大的创新。它们使创建简单的不可变类变得更加容易,这些类是纯粹的值集合,而不会丢失各种库中通用元组类中固有的上下文。

由 Brian Goetz ( https://openjdk.java.net/jeps/384 )编写的 JEP 描述很好地解释了意图。然而,我期待与最终引入的值类型有更密切的联系。值类型的最初目标是相当广泛的:通过消除这些类型的对象不需要的所有开销(例如引用间接、同步),本质上允许对那些最重要的对象进行潜在的显着性能改进。此外,它还可以提供句法细节,例如myPosition != yourPosition代替!myPosition.equals(yourPosition).

似乎记录的限制与潜在值类型所需的限制类型非常接近。然而,JEP 在动机中没有提及这些目标。我试图找到有关这些审议的任何公开记录,但没有成功。

所以我的问题是:记录是否旨在成为可能向值类型转变的一部分,还是这些完全不相关的概念和未来的值类型可能看起来完全不同?

我提出这个问题的动机是:如果记录成为语言的永久部分,那么如果在未来的版本中可能会带来显着的性能优势,那么在代码中采用它们将是一个额外的动力。

java java-14 java-record

45
推荐指数
2
解决办法
2411
查看次数

Lombok getter/setter 与 Java 14 记录

我喜欢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 getter lombok java-14 java-record

37
推荐指数
4
解决办法
6586
查看次数

Java 14 记录文档中“浅不可变”的含义

我正在阅读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 java-14 java-record

26
推荐指数
2
解决办法
1565
查看次数

我可以将 Java 16 记录与 JPA 实体一起使用吗?

我正在尝试做类似下面的事情。

@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 jpa spring-data-jpa spring-boot java-record

25
推荐指数
1
解决办法
1万
查看次数

发布 Java-14 getter/setter 命名约定

Java 14 引入了记录功能。Record 创建与字段同名的 getter,因此可以编写print(person.name())例如。但是旧的 Java bean 约定规定应该将此方法命名为getName().

在同一个代码库中使用这两种样式看起来不太好。将所有内容迁移到记录是不可能的,因为它们太有限而无法替换所有用例。

是否有任何官方或半官方指南如何在新代码中以 Java 14 命名 getter 和 setter?

java getter naming-conventions java-14 java-record

23
推荐指数
2
解决办法
2832
查看次数

记录是类的语法糖吗?

我最近发现了 Java记录,了解它们的存在和用途真是太神奇了。

然而,我开始怀疑它们是否本质上只是幕后的类。

这是否意味着在编译过程中,它们会被转换为具有最终私有字段、公共构造函数和必要的 getter 的显式类?

java record java-record

22
推荐指数
1
解决办法
2268
查看次数

如何记录 Java Record 参数?

应该如何记录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提交了错误报告

java javadoc intellij-idea java-14 java-record

20
推荐指数
1
解决办法
720
查看次数

您是否需要覆盖记录的 hashCode() 和 equals() ?

假设以下示例:

public record SomeRecord(int foo, byte bar, long baz)
{ }
Run Code Online (Sandbox Code Playgroud)

我是否需要覆盖hashCodeequals如果我要将所述对象添加到 a 中HashMap

java java-14 java-record

20
推荐指数
2
解决办法
1353
查看次数

定义记录的默认构造函数

我有一个记录,想向它添加默认构造函数。

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)

我们如何向记录添加默认构造函数?

java java-14 java-record

18
推荐指数
2
解决办法
5615
查看次数

有没有办法通过反射识别 Java 16 记录的规范构造函数?

假设我有这样的记录(或任何其他记录):

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 reflection java-record java-16

16
推荐指数
2
解决办法
1100
查看次数