问题标签 [java-record]

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 投票
1 回答
225 浏览

java - Java 记录序列化和对规范构造函数的重复调用

这篇关于可序列化记录的帖子中指出

反序列化通过调用记录类的规范构造函数创建一个新的记录对象,将从流中反序列化的值作为参数传递给规范构造函数。这是安全的,因为这意味着记录类可以在将值分配给字段之前对其进行验证,就像普通 Java 程序通过 new 创建记录对象一样。“不可能”的物体是不可能的。

这与仅用于验证的构造函数争论。但是,当构造函数操作参数时,这会导致相当奇怪的行为。考虑这个非常人为的简单示例:

以下记录a在保存之前对其进行操作:

下面的程序只是第一次保存序列化的记录并在随后的时间加载它:

第一次运行的输出是TRecord[a=4],TRecord[a=3]在随后的运行中,我从反序列化中得到的状态与我在那里输入的不同。使用类似下面的类似课程TClass[a=4]每次都会得到相同的结果。

所以我的问题是:是否有任何规则禁止/不鼓励使用构造函数进行验证以外的任何操作(例如,我正在考虑在存储输入之前散列密码)?还是有另一种方法来反序列化对象以恢复初始状态?

0 投票
0 回答
158 浏览

java - 如何将 Java 记录的构造函数设为私有?

通过创建 Java 记录

一个也得到一个

其签名来自记录组件列表的公共构造函数

可以通过所谓的紧凑构造函数来改进此构造函数的行为

但是,不起作用的是将构造函数设为私有。

java:Rec 记录中的无效规范构造函数(试图分配更强的访问权限;是公开的)

有什么方法可以使记录的构造函数私有?

万一有人在想为什么会做这样的事情。该记录应与建设者一起扩展。要强制使用构建器,构造函数应该是私有的。

0 投票
1 回答
624 浏览

java - 在 Java 记录中强制执行不可变集合?

Java 记录用于实现浅不可变的数据载体类型。如果构造函数接受可变类型,那么我们应该实现显式防御性复制以强制不变性。例如

这有点烦人 - 我们必须

  1. 实现一个老式的 POJO 构造函数(复制字段)而不是使用规范的构造函数和
  2. 显式初始化每个字段只是为了处理可变字段的防御性副本。

理想情况下,我们想要表达的内容如下:

或者

这里我们使用一个虚构的ImmutableSet类型和Set::isMutable方法,无论哪种情况,记录都是使用规范构造函数创建的——nice。不幸的是它不存在!

据我所知,内置集合类型(Java 10 中引入)是隐藏的,即无法确定集合是否不可变(除非尝试修改它)。

我们可以使用 Guava,但是当 99% 的功能已经在核心库中时,这似乎有点过头了。或者,有 Maven 插件可以测试被注释为不可变的类,但这同样是一种创可贴,而不是一种解决方案。

是否有任何纯 Java 机制来强制执行不可变集合?

0 投票
1 回答
93 浏览

java - RecordComponent::getDeclaringRecord 的目的是什么

RecordComponent有方法getDeclaringRecord。我似乎无法理解它的目的是什么,尤其是因为它是public.

获得 a 的唯一方法RecordComponent是通过调用Record::getRecordComponents,如果我这样调用它,我已经知道声明它的记录RecordComponent?我似乎无法理解它的实际目的。

我也无法连接为什么返回类型不是Class<? extends Record>...

0 投票
2 回答
717 浏览

java - 使用 Java 记录作为 JPA 嵌入

我想将 Javarecord用作 JPA 的可嵌入对象。例如,我想将 ID 包装在记录中以使其类型安全:

但是如果我尝试使用 Hibernate 5.4.32 坚持它,我会收到以下错误:

所以看起来 Hibernate 会像对待record Id实体一样对待它,尽管它是一个@Embeddable.

非 id 字段和 也会发生同样的情况@Embedded

有没有办法将@Embeddable records 与 JPA/Hibernate 一起使用?

0 投票
1 回答
204 浏览

java - Java 16 记录 BigDecimal 等于和哈希码

我们在日常项目中使用 Lombok,我喜欢它的简洁性。我们有一个 BigDecimal 属性的基调,并通过一些努力使它们忽略了 Lombok 生成的 equals 和 hashCode 方法中的比例。有没有办法在 Java 16 中引入的新记录类中做到这一点?

0 投票
1 回答
1074 浏览

java - C-style arrays do not work with records anymore

I was previously using this contrived code

which is making use of the C-style array-notation. And it compiled fine in Java 15.

Now, all of the sudden, with the official release of records in Java 16, it does not compile anymore. Here is the output from jshell:

Why did it compile in Java 15, was this a bug? Out of curiousity, why is it not supported in records, while being supported anywhere else in Java?

I am using javac from Adoptium (based on OpenJDK).

0 投票
1 回答
314 浏览

java - Java 中记录与类的 hashCode() 和 equals() 的默认实现

尝试使用示例代码检查记录与类的默认行为,记录equals()行为似乎不同。hashCode()

这是记录类的代码示例

上述代码执行后输出为:

谁能帮我理解记录s default implementation for 等于andhashCode 的行为与上述不同吗?

如果记录equalshashCode实施发生变化,那么请帮助我了解该变化的确切目的以及在哪些场景中使用它会更有帮助。

0 投票
2 回答
591 浏览

java - 如何通过 Java 17 中的反射获取所有 Record 字段及其值?

我有一堂课:

我将其替换为 Java 17 中的记录:

另外,我有一个代码通过反射进行验证,该代码与常规类一起使用,但不适用于记录:

通过 Java 17 中的反射获取 Record 对象字段及其值的正确方法是什么?

0 投票
1 回答
107 浏览

java - 为什么 RecordComponent 没有在 Java 17 的 Records 类中定义的注释信息?

我玩唱片,发现一些对我来说看起来不合逻辑的东西:

记录:

代码:

但是,如果我这样做:

这是预期的吗?因为RecordComponent implements AnnotatedElement,所以我认为RecordComponent应该有关于注释的信息。我的期望错了吗?