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​​类一样。


技术类文章精选

无代码文章精选

从Java到Groovy的八级进化论_性能测试从Java到Groovy的八级进化论_linux_02