后 Java-14 getter/setter 命名约定

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

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

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


答案 1

引用JEP 359

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

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

话虽如此:

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

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

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

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


答案 2

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

虽然这并不像我想要的那么整洁,但记录可以有方法,因此您可以将“遗留”getter添加到您的,如下面的(人为的但简单的)示例所示。record

public interface Nameable {
   public String getName();
}

public record Person(String name) implements Nameable {
   public String getName() {
      return name;   // or return name();
   }
}

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

你可以说语言设计师已经履行了他们“不对样板宣战”的职责。