Groovy và sự khác biệt với Java

admin

Groovy - một ngôn từ thiết kế động chạy xe trên nền máy ảo Java, với những công dụng tương tự động như Python hoặc Ruby . Nó tương hỗ cho tới 99% cú pháp của Java, bởi vậy việc các bạn paste 1 đoạn code Java nhằm chạy xe trên Groovy là vấn đề rất là giản dị và thân thiện thiện với Java Developer.

Làm việc với Groovy từ thời điểm năm 2013 Khi Google IO công phụ thân Android Studio dùng Gradle build với groovy script.
Nhưng cho tới giờ đây, bản thân vẫn chưa tồn tại thời cơ dùng Groovy như 1 ngôn từ thay cho thế vô dự án công trình thực tiễn. Mọi loại với bản thân vẫn chỉ tạm dừng ở việc config build script vô Gradle , hoặc Jenkins pipeline. Vì vậy, với toàn bộ những gì bản thân tìm hiểu hiểu và một chút ít tay nghề của phiên bản thân thiện, kỳ vọng chúng ta nằm trong đóp gom chủ kiến nếu như với điều gì ko đích. Xin cảm ơn!!

1. Default imports

Việc import package mỗi lúc dùng class ví dụ như java.io.File vẫn thông thường là đề nghị cho từng Java Developer. Nhưng vô groovy thì ko cần thiết thực hiện vấn đề đó, đem ấn định những packages sau đang được imported.

    java.io.*
    java.lang.*
    java.math.BigDecimal
    java.math.BigInteger
    java.net.*
    java.util.*
    groovy.lang.*
    groovy.util.*

2. Multi-methods

Giả sử tất cả chúng ta với đoạn code với 2 method hấp thụ ông chồng như bên dưới. Compile và chạy cho tất cả Java và Groovy --> tiếp tục mang đến 2 thành phẩm không giống nhau.

int method(String arg) {
    return 1;
}

int method(Object arg) {
    return 2;
}
Object o = "Object";
int result = method(o);

Kết trái ngược :

  • Java result được xem là 2.
  • Groovy result được xem là 1.

Với Java thì những method sẽ tiến hành lựa chọn Khi compile, dựa vào data type đang được khai báo vô ví bên trên là Object

Còn với Groovy thì những method sẽ tiến hành lựa chọn Khi runtime , nó cũng dựa vào data type đang được khai báo. Nhưng Khi runtime, o thời điểm hiện nay là String object. Vì vậy 1 là thành phẩm bên trên Groovy ==> Vấn đề này được gọi là runtime dispatch or multi-methods vô Groovy.

3. Khởi tạo nên một Array

Với Java, việc khởi tạo nên array hoàn toàn có thể triển khai như sau :

int[] array = { 1, 2, 3}

Nhưng vô groovy, nó ko được luật lệ. Vì cặp { } chỉ thích hợp cho tới closures. Thay vì như thế này sẽ dùng như sau để thay thế thế :

int[] array = [1,2,3]

4. Package scope visibility

Trong Java :

class Person {
    String name
}

Trong groovy, không tồn tại định nghĩa access modifier dành riêng cho field.

Điều bại tức là , mặc dù các bạn được thêm / vô hiệu hóa modifier của field tương tự như Java thì cũng ko tác động gì cho tới kỹ năng truy xuất của field bại cả.

Để thực hiện vấn đề đó,cần dùng annotation @PackageScope cái tiếp tục kết phù hợp với gettersetter của field bại ( getter và setter được ngầm ấn định dẫn đến vô groovy)

class Person {
    @PackageScope String name
}

5. ARM blocks

ARM (Automatic Resource Management) được tương hỗ kể từ Java 7. Trong Khi Groovy lại ko tương hỗ. Thay vô bại groovy cung ứng những cơ hội không giống nhau dựa vào closures - cái với hiệu suất cao tương tự trong lúc closures đem đến sự cụt gọn gàng hơn

// Java
Path tệp tin = Paths.get("/path/to/file");
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

} catch (IOException e) {
    e.printStackTrace();
}
//Groovy
new File('/path/to/file').eachLine('UTF-8') {
   println it
}
//Hoặc closer to lớn Java
new File('/path/to/file').withReader('UTF-8') { reader ->
   reader.eachLine {
       println it
   }
}

6. Inner classes

Việc tạo nên một anonymous inner classes và nested classes vẫn tuân hành theo đòi quy tắc của Java. Tuy nhiên vô groovy cú pháp với phần giản dị rộng lớn và loại xẻ một vài syntax , ko xẻ kể từ truy xuất, trở thành local ko phải là final

Static inner classes

class A {
    static class B {}
}

new A.B()

Anonymous Inner Classes

import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit

CountDownLatch called = new CountDownLatch(1)

Timer timer = new Timer()
timer.schedule(new TimerTask() {
    void run() {
        called.countDown()
    }
}, 0)

assert called.await(10, TimeUnit.SECONDS)

Tạo instances of Non-Static Inner Classes

//Java 

public class Y {
    public class X {}
    public X foo() {
        return new X();
    }
    public static X createX(Y y) {
        return y.new X();
    }
}

Cú pháp y.new X(); ko được tương hỗ vô groovy. Thay vô bại , tất cả chúng ta cần ghi chép new X(y) như bên dưới :

//Groovy

public class Y {
    public class X {}
    public X foo() {
        return new X()
    }
    public static X createX(Y y) {
        return new X(y)
    }
}

7. Lambdas

Java 8 với Lambdas thì groovy với Closures.

Đây là cơ hội Java 8 thể hiện nay với lambdas :

Runnable lập cập = () -> System.out.println("Run");
list.forEach(System.out::println);

Còn với Groovy

Runnable lập cập = { println 'run' }
list.each { println it } // or list.each(this.&println)

8. GStrings

Trong Java nhằm nối những string cùng nhau tất cả chúng ta thông thường sử dụng sử dụng toán tử + nhằm nối chuỗi, tương đương như vậy này:

    String name = "Nguyen Van Manh";
    System.out.println("Xin chao " + name + "!");

Còn vô groovy thì giản dị và dễ dàng và đơn giản rộng lớn thật nhiều.

    String name = "Nguyen Van Manh";
    println "Xin chao ${name}!"

Và cặp Double-quoted string literals ${} như bên trên được gọi là GString value.

9. String và Character literals

Trong Groovy, Singly-quoted được dùng cho tới String và double-quoted được dùng cho tới String hoặc GString (nếu với interpolation GString ${} )

assert 'c'.getClass()==String
assert "c".getClass()==String
assert "c${1}".getClass() in GString

Kiểu tài liệu char chỉ được hiểu chỉ Khi khi báo tường minh một trở thành là char

char a='a'
assert Character.digit(a, 16)==10 : 'But Groovy does boxing'
assert Character.digit((char) 'a', 16)==10

try {
  assert Character.digit('a', 16)==10
  assert false: 'Need explicit cast'
} catch(MissingMethodException e) {
}

Casting Character

Groovy tương hỗ 2 loại casting kể từ String thanh lịch --> char. Tại phía trên cũng có thể có sự khác lạ vô cơ hội cast.

//Cách 1
assert ((char) "c").class==Character  // OK 
assert ((char) "cccc").class==Character  // Error GroovyCastException  

//Cách 2
assert ("c" as char).class==Character  // OK 
assert ("abc" as char).class==Character  // OK, tuy nhiên chỉ lấy ký tự động a đầu tiên

10. Primitives và wrappers

Groovy dùng Object cho tới toàn bộ tất cả, loại tài liệu primitive tiếp tục tự động hóa wrap cho tới class wrapper tương úng.

Primitive wrappers table

Primitive type Wrapper class
boolean Boolean
char Character
short Short
int Integer
long Long
float Float
double Double

Cùng coi ví dụ bên dưới giúp xem sự khác lạ Khi runtime dùng Java và Groovy.

int i
m(i)

void m(long l) {           
  println "in m(long)" // method Java tiếp tục gọi
}


// method Grovy tiếp tục gọi, tự động hóa wrap int --> Integer
void m(Integer i) {        
  println "in m(Integer)" 
}

11. So sánh ==

Trong Java, đối chiếu == được hiểu là đang được đối chiếu 2 độ quý hiếm primitive hoặc nhận dạng những objects.

Trong Groovy == được hiểu là a.compareTo(b)==0 nếu như ab là Comparable, ngược lại sẽ tiến hành hiểu là a.equals(b)

12. Conversions

Bảng đối chiếu việc quy đổi loại tài liệu thân thiện Java và Groovy.

  • Y : Yes, Java hoàn toàn có thể gửi đổi
  • C : Yes, tuy nhiên cần thiết cast một cơ hội tường minh
  • T : Yes, tuy nhiên tài liệu có khả năng sẽ bị vứt bớt
  • N : No, Không cho tới phép

Java Conversions Table

Converts from boolean byte short char int long float double
boolean - N N N N N N N
byte N - Y C Y Y Y Y
short N C - C Y Y Y Y
char N C C - Y Y Y Y
int N C C C - Y T Y
long N C C C C - T T
float N C C C C C - Y
double N C C C C C C -

Grroovy Conversions Table

Converts from boolean Boolean byte Byte short Short char Character int Integer long Long BigInteger float Float double Double BigDecimal
boolean - B N N N N N N N N N N N N N N N N
Boolean B - N N N N N N N N N N N N N N N N
byte T T - B Y Y Y D Y Y Y Y Y Y Y Y Y Y
Byte T T B - Y Y Y D Y Y Y Y Y Y Y Y Y Y
short T T D D - B Y D Y Y Y Y Y Y Y Y Y Y
Short T T D T B - Y D Y Y Y Y Y Y Y Y Y Y
char T T Y D Y D - D Y D Y D D Y D Y D D
Character T T D D D D D - D D D D D D D D D D
int T T D D D D Y D - B Y Y Y Y Y Y Y Y
Integer T T D D D D Y D B - Y Y Y Y Y Y Y Y
long T T D D D D Y D D D - B Y T T T T Y
Long T T D D D T Y D D T B - Y T T T T Y
BigInteger T T D D D D D D D D D D - D D D D T
float T T D D D D T D D D D D D - B Y Y Y
Float T T D T D T T D D T D T D B - Y Y Y
double T T D D D D T D D D D D D D D - B Y
Double T T D T D T T D D T D T D D T B - Y
BigDecimal T T D D D D D D D D D D D T D T D -
  • Y : Yes, Groovy hoàn toàn có thể gửi đổi
  • D : Yes, tự động hóa quy đổi Khi compile hoặc cần thiết cast một cơ hội tường minh
  • T : Yes, tuy nhiên tài liệu có khả năng sẽ bị vứt bớt
  • B : Yes, tự động hóa boxing/unboxing N : No, ko cho tới phép

13. Extra keywords

Ngoài những keywords của Java, thì Groovy còn dùng thêm thắt một vài keywords bên dưới :

  • as
  • def
  • in
  • trait

Cũng tương tự như Java, những keywords cũng ko được dùng như thương hiệu trở thành.

14. Không dùng vệt ;

Với Java, sau từng statement tiếp tục kết đôn đốc vì chưng 1 vệt chấm phẩy ;. Nhưng với Groovy thì vấn đề đó là ko đề nghị, tất yếu với cũng rất được tuy nhiên không tồn tại cũng không vấn đề gì. Groovy đều hiểu và compile trọn vẹn thông thường.

Chỉ với điều, nếu như vệt ; được dùng, một vài IDE tiếp tục ghi lại này đó là ko quan trọng.

15. Từ khóa return - ko bắt buộc

    static void main(String[] args) {
        int i
        def result = m(i)
        println "Ket qua chuyện = ${result}"
    }

    static int m(Integer i) {
        100
    }

Với Groovy return ở một method không hề là đề nghị. Vấn đề này đặc biệt hữu ich với những block code như closures hoặc những method giản dị.

Tất nhiên , nó ko tức là tất cả chúng ta tiếp tục vứt return, vì như thế vô một vài tình huống việc dùng return vẫn chính là quan trọng.

16. class suffix hoàn toàn có thể vứt qua

.class suffix hoàn toàn có thể bỏ lỡ Khi pass như parameter. Như Person.class ví dụ mặt mũi dưới

    static void main(String[] args) {

        // hoàn toàn có thể hiểu là Person.class
        def p = newInstance(Person)  
        println p.name
    }

    static Person newInstance(Class clazz) {
        return clazz.newInstance()
    }

17. Try Catch Exception

Với Java bạn phải chỉ định và hướng dẫn tường minh Exception vô catch.

Nhưng với Groovy , giản dị chỉ việc như sau

    try {
        Integer.parseInt("aaa")
    } catch (e) {
        println e.getMessage()
    }

Và hoàn toàn có thể còn thật nhiều sự khác lạ hoặc ho nữa vô Groovy.

Tổng kết

Trên phía trên đơn giản những gì bản thân tìm hiểu hiểu và ghi chép lại theo đòi ý hiểu của phiên bản thân thiện và một vài cái được vận dụng Khi thao tác thực tiễn.

Với Groovy nó tương hỗ cho tới 99% cú pháp của Java, không chỉ có vậy nó mang đến sự cụt gọn gàng giản dị vô cú pháp trình diễn. Sẽ gom tất cả chúng ta cách tân và phát triển phần mềm một trong những phần nào là bại nhanh gọn lẹ rộng lớn, một Khi Grails càng ngày càng phổ biến

Để tìm hiểu hiểu Groovy, Learning , Documentation vv.. chúng ta có thể tìm hiểu hiểu bên trên http://groovy-lang.org