
使用 Apache Groovy 的命名参数增强代码可读性和可维护性
Java Records 提供了一种现代且简洁的方法来定义 Java 中的简单数据对象,从而提高代码的可读性和可维护性,并减少错误的可能性。Java 14 中引入的此功能引起了相当大的兴趣。Records 的两个突出特点是自动创建 getter 和 setter 以及构造函数中的命名参数。
自 Apache Groovy 诞生以来,它就提供了这些类型的低仪式感和可读性功能。 此外,Groovy 在整个语言中都提供了这些功能,而不仅仅是在像 Java Records 这样的有限情况下。
在本系列的上一篇文章中,您了解了 Apache Groovy 如何简化所有类中与 getter 和 setter 相关的细节。
Groovy 也提供了命名参数,类似于 Python 的关键字参数,它提供的效果类似于在 Java 中初始化 Records。但是,在 Groovy 中,命名参数可以用于任何类定义,而不仅仅是在像 Java Records 这样的有限情况下(如果您尚未安装 Groovy,请阅读本系列文章的介绍。)
从上一篇文章中 Circle 类的定义出发,您可以按如下方式使用命名参数
1 class Circle {
2 double x, y, r
3 public double getA() {
4 return Math.PI * this.r * this.r;
5 }
6 public double getC() {
7 return 2.0d * Math.PI * this.r;
8 }
9 public void setA(double a) {
10 this.r = Math.sqrt(a / Math.PI);
11 }
12 public void setC(double c) {
13 this.r = c / 2.0d / Math.PI;
14 }
15 }
16 def c = new Circle(x: 2.75d, y: 3.98d, r: 15d)
17 println "c.x ${c.x} c.y ${c.y} c.r ${c.r} c.a ${c.a} c.c ${c.c}"
您不需要构造函数,因为默认构造函数提供了您需要的功能。如果您确实提供了构造函数,则它要么需要是一个无参数构造函数,要么将 Map 作为第一个参数;并且 Map 将期望与类中声明的字段相对应的条目。
您仍然需要为 area 和 circumference 定义 getter 和 setter,因为这些与 Circle 类的声明属性无关,并且您仍然使用点表示法来使用它们(例如,在第 17 行中)。
请注意第 16 行,您在其中使用了 Circle 构造函数的命名参数。 它们在此应用程序中特别好用,因为使用 Circle 类的程序不再需要担心参数的顺序,并且它们与命名良好的参数结合使用时,与三个常量值的列表相比,增加了更多的清晰度。
使用的特定表示法最终在后台创建了一个 Map 实例 [x: 2.75d, y: 3.98d, r: 15d],该实例被传递到构造函数中。
Groovy 参考文档提供了关于命名参数的更多有用细节。
结论
命名参数是一种避免记住任何方法调用(不仅是初始化记录构造函数)的参数顺序的好方法。 此外,命名参数可以与为参数声明的默认值结合使用,以便程序员只需指定与默认值不同的值。
在我看来,此功能的真正价值在于减少需要阅读和理解的代码量; 当然,这也意味着程序员需要知道默认值并接受它们!
这篇文章是关于 Apache Groovy 系列文章的一部分,请继续关注更多内容.
图片来源:travelnow.or.crylater,来自 Unsplash
1 条评论
评论已关闭。