【问题标题】:Writing to a Record field in Java 14在 Java 14 中写入记录字段
【发布时间】:2020-09-21 23:05:44
【问题描述】:

通过对 Java 14 中 Records 简介的简短搜索,我看到 Record 字段被编译为最终实例变量。这似乎意味着我不能写入记录字段。。教程也没有提到任何关于写入记录字段的内容。

这是为什么呢?为什么我不能像在 C 中使用结构一样在 Java 14 中使用 Record?

感谢您的任何见解

【问题讨论】:

  • JDK 团队讨论了将来在记录中添加“withers”(突变器)。目前,我已经编写了一个记录生成器库,它将生成器和威瑟斯添加到记录中。在 Oracle 添加新功能之前,这样的库就足够了:github.com/Randgalt/record-builder

标签: java java-14 java-record


【解决方案1】:

记录为声明类提供了简洁的语法 浅层不可变数据

的透明持有者

...

记录的组成部分是隐式最终的。这一限制体现了一个 默认不可变策略广泛适用于数据聚合

Source

不可变,至少在表面上是不可变的,这正是重点。记录被设计为值类型,所以不,您不能更改它们。

【讨论】:

  • 另一个可能更有用的文档是Data Classes and Sealed Types for Java,它涉及到所涉及的设计决策,尤其是关于 Algebraic Annie、Boilerplate Billy、JavaBean Jerry、POJO Patty、Tuple Tommy 和 Values Victor 的部分。跨度>
  • @DavidConrad 这是一个很好的链接,谢谢。部分:“为了记录,我们进行了类似的交易;我们放弃了将类 API 与其状态描述分离的灵活性,以换取高度简化的声明(以及更多)。”我认为如果我们要对紧凑状态进行建模,那么可以修改状态会更有意义。我不确定 Java 程序员是否真的可以使用不可变状态而不是可变紧凑状态。
  • @ppp Java 程序员能够很好地利用字符串的不可变状态。您可以在记录中添加诸如“withX”之类的方法,以返回具有不同字段值的新记录。
  • @DavidConrad 谢谢,是的,这就是我最终所做的。另一方面,从技术上讲,如果你想要可变原语,可以包装在一个对象中,尽管有很多代码气味
  • @ppp 您对“紧凑”一词的使用掩盖了您的假设,即记录的主要目的是句法简洁,但事实并非如此。主要目的是语义清晰;你也得到了简洁的句法是一个奖励。记录是名义元组(Tommy 获胜。)元组通常是不可变的(我确信有反例,但我现在想不出。)
猜你喜欢
  • 2020-07-30
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多