后 Java-14 getter/setter 命名约定
Java 14 引入了记录功能。记录创建与字段同名的 getter,因此例如可以编写。但是旧的Java Bean约定要求应该将此方法命名为.print(person.name())
getName()
在同一个代码库中使用这两种样式看起来不是很好。不可能将所有内容迁移到记录中,因为它们太有限,无法替换所有用例。
是否有任何官方或半官方指南如何在新代码中以Java 14命名getters和setters?
Java 14 引入了记录功能。记录创建与字段同名的 getter,因此例如可以编写。但是旧的Java Bean约定要求应该将此方法命名为.print(person.name())
getName()
在同一个代码库中使用这两种样式看起来不是很好。不可能将所有内容迁移到记录中,因为它们太有限,无法替换所有用例。
是否有任何官方或半官方指南如何在新代码中以Java 14命名getters和setters?
引用JEP 359:
宣布“向样板文件宣战”不是目标;而是向样板文件宣战的目标。特别是,使用 JavaBean 命名约定解决可变类的问题并不是一个目标。
我的理解是,基于同一文档,记录是.transparent holders for shallowly immutable data
话虽如此:
总而言之,恕我直言,他们是向前迈出的一步...我写了这个示例集,你可以看到从标准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的替代品......
从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上下文。
你可以说语言设计师已经履行了他们“不对样板宣战”的职责。