Groovy和Java确实是亲戚关系,它们的语法非常相似,因此对于Java开发人员来说,Groovy非常容易学习。相似之处在于,大多数Java程序甚至都是有效的Groovy程序(把文件后缀 .java
改成 .groovy
即可)。
我将从一个基础 Hello World
程序开始,分享一下Java如何演化成Groovy的Demo。
原始的 Hello World
public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println(helloWorld.greet()); } } 复制代码
这个 Hello World
类具有一个私有字段,该私有字段表示名称及其相关的 getter()
和 setter()
。还有一个 greet()
方法,该方法将返回著名的 Hello World
字符串。然后是一个 main()
方法,该方法将实例化我们的类,设置名称并在输出欢迎消息。
Groovy程序一级进化
public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.setName("Groovy") System.out.println(helloWorld.greet()); } } 复制代码
初级进化的Groovy跟Java程序是完全相同的程序!这并不是真正的Groovy程序,因为我们可以对其进行改进以使其更加简洁易读。
Groovy程序二级进化
我们将通过执行一些简单的步骤来 Groovy化
该程序。第一步将是删除分号:并且,同时,我还将删除public关键字,因为默认情况下,类和方法在 Groovy
中是 public
,除非另有明确说明。我们的 Groovy
程序现在变为:
class HelloWorld { private String name void setName(String name) { this.name = name } String getName() { return name } String greet() { return "Hello " + name } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.setName("Groovy") System.out.println(helloWorld.greet()) } } 复制代码
Groovy程序三级进化
我们还可以使用 Groovy
的特殊字符串: GString
。在用双引号分隔的普通字符串中,可以放置一些用 ${someVariable}
分隔的占位符,当打印该字符串时,它们将被变量或表达式的值替换。因此,无需费心手动连接字符串。那么,我们的 greet()
方法是什么样的呢?
String greet() { return "Hello ${name}" } 复制代码
Groovy程序四级进化
更进一步:可以省略 return
关键字,方法的最后一个计算表达式将是返回值。因此, greet()
现在甚至更简单了:
class HelloWorld { private String name void setName(String name) { this.name = name } String getName() { name } String greet() { "Hello ${name}" } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.setName("Groovy") System.out.println(helloWorld.greet()) } } 复制代码
甚至可以自由地将 getName()
和 greet()
方法转换为单行代码。
Groovy程序五级进化
但是接下来呢? Groovy
类属性方法开始起作用。可以简单地声明一个属性,而不是创建一个私有字段并编写一个 getter
和 setter
方法。在 Groovy
中,属性非常简单,因为它们仅是字段声明,没有任何特定的可见性。我们的 name
属性将只是 String name
,仅此而已。 Groovy
将免费提供一个私有字段以及相关的 getter
和 setter
。对于调用 setName()
,您将能够编写 helloWorld.name ="Groovy"
,对于 getName()
,只需编写 helloWorld.name
。
class HelloWorld { String name String greet() { "Hello ${name}" } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.name = "Groovy" System.out.println(helloWorld.greet()) } } 复制代码
Groovy程序六级进化
Groovy为您提供了一些诸如打印之类的日常任务的便捷方法和快捷方式。您可以将 System.out.println()
替换为 println()
。Groovy甚至通过提供其他实用程序方法来装饰JDK类。对于顶级语句(仅是带有某些参数的方法调用的语句),可以省略括号。
class HelloWorld { String name String greet() { "Hello ${name}" } static void main(String[] args) { HelloWorld helloWorld = new HelloWorld() helloWorld.name = "Groovy" println helloWorld.greet() } } 复制代码
Groovy程序七级进化
到目前为止,我们通过定义每个方法,变量或字段的类型在各处使用了强类型。 Groovy
还支持动态键入。因此,如果愿意,我们可以摆脱所有类型:
class HelloWorld { def name def greet() { "Hello ${name}" } static main(args) { def helloWorld = new HelloWorld() helloWorld.name = "Groovy" println helloWorld.greet() } } 复制代码
我将字符串转换为 def
关键字,我们能够删除 main
方法的 void
返回类型以及其参数的字符串类型数组。
Groovy程序八级进化
Groovy是一种面向对象的语言,它支持与Java相同的编程模型。但是同时Groovy还拥有一个重要的特性:Groovy是一种脚本语言,因为它允许编写一些不需要定义类结构的自由格式程序。因此,在本教程的最后一步,我们将完全摆脱主要方法:
class HelloWorld { def name def greet() { "Hello ${name}" } } def helloWorld = new HelloWorld() helloWorld.name = "Groovy" println helloWorld.greet() 复制代码
脚本实际上只是一堆随意扔到程序中的代码。甚至可以在脚本中定义几个类,就像我们的 HelloWorld
类一样。
原文
https://juejin.im/post/5e6840ce6fb9a07c7c2d73d7
本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 从Java到Groovy的八级进化论