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

vbe*_*nar 23 java getter naming-conventions java-14 java-record

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

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

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

小智 14

引自JEP 359

宣布“向样板开战”不是目标;特别是,使用 JavaBean 命名约定解决可变类的问题并不是目标。

我的理解是,基于同一个文档,记录transparent holders for shallowly immutable data.

话虽如此:

  1. 记录不是寻找 getter/setter 语法糖的地方,因为它们并不打算取代 JavaBean。
  2. 我非常同意您的观点,即 JavaBeans 过于冗长。也许可以实现一个附加功能(称为beans而不是记录) - 与记录功能非常相似的行为,但这将允许可变性。在这种情况下,记录bean不会相互排斥。
  3. 如前所述,记录处于预览模式。让我们看看社区的反馈是什么。

总而言之,恕我直言,他们向前迈进了一步......我写了这个例子集,你可以看到代码从标准 JavaBeans 减少到 ~15% LOC。

另外,请注意records behave like normal classes: they can be declared top level or nested, they can be generic, they can implement interfaces(来自同一文档)。实际上,您可以通过提取包含 getter 的接口来部分模拟 JavaBeans(不过,只有 getter 才有意义)——但这需要大量工作,而不是一个真正干净的解决方案......

所以,根据上面的逻辑,为了解决你的问题,- 我没有看到任何关于 getter 和 setter 的(半)官方指南,我认为现在没有动机,因为再次记录不是 JavaBeans 的替代品...


sxc*_*731 7

从 Java 17 开始,record规范现已成为“最终版” ,但不幸的是,这种命名约定差异尚未得到解决。当我尝试利用 Records 作为浅层持有者类来实现现有域模型的接口部分时,我偶然发现了它。

虽然这不是我想要的那么简洁的解决方案,但 Records 可以有方法,因此您可以向您的 中添加“遗留”getter record,如下面的(人为但简单)示例所示。

public interface Nameable {
   public String getName();
}

public record Person(String name) implements Nameable {
   public String getName() {
      return name;   // or return name();
   }
}
Run Code Online (Sandbox Code Playgroud)

至少这允许客户端代码继续使用经过尝试和测试(已有 20 多年历史)的约定,让我们面对现实吧,该约定的使用量远远超过纯 JavaBeans 上下文。

你可以说语言设计者已经履行了“不向样板宣战”的职责

  • 恕我直言,“公共记录 Person(String getName)”会损害代码的可读性;如果该字段正在引用记录的方法,则更是如此。另外,请务必考虑到,在上述场景中,我们讨论的不仅仅是偏好,而是需要改造现有的 API(“Nameable”),人们可能有能力也可能没有能力改变...... (8认同)
  • 像 getter 这样命名字段是一个糟糕的主意,特别是如果您想序列化记录。然后你的 JSON 中将会有一个 "getName": "Brad Idea" ;) (4认同)