groovy là gì

Groovy - một ngôn từ thiết kế động điều khiển xe trên nền máy ảo Java, đem 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, vì thế việc các bạn paste 1 đoạn code Java nhằm điều khiển xe trên Groovy là vấn đề rất là giản dị và đơn giản và đằm thắm 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 lúc nà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 thăm dò hiểu và một ít kinh nghiệm tay nghề của bạn dạng đằm thắm, kỳ vọng chúng ta nằm trong đóp chung chủ ý nếu như đem điều gì ko chính. Xin cảm ơn!!

Bạn đang xem: groovy là gì

1. Default imports

Việc import package mọi khi dùng class ví dụ như java.io.File vẫn thông thường là cần cho từng Java Developer. Nhưng vô groovy thì ko cần thiết thực hiện vấn đề đó, đem quyết đị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 đem đ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 đưa về 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 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 tại 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 rất có thể triển khai như sau :

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

Nhưng vô groovy, nó ko được phép tắc. Vì cặp { } chỉ nói riêng mang lại closures. Thay vì 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 ê Tức là , cho dù các bạn nhận thêm / vô hiệu modifier của field tựa như Java thì cũng ko tác động gì cho tới năng lực truy xuất của field ê cả.

Để thực hiện vấn đề đó,cần dùng annotation @PackageScope loại tiếp tục kết phù hợp với gettersetter của field ê ( getter và setter được ngầm quyết đị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ô ê groovy cung ứng những cơ hội không giống nhau dựa vào closures - loại đem hiệu suất cao tương tự trong lúc closures mang đến sự cộc 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 đồ sộ 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 vâng lệnh theo đòi quy tắc của Java. Tuy nhiên vô groovy cú pháp đem phần giản dị và đơn giản rộng lớn và loại xẻ một vài syntax , ko xẻ kể từ truy xuất, biến hóa 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ô ê , 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 đem Lambdas thì groovy đem 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 người sử dụng sử dụng toán tử + nhằm nối chuỗi, tương tự 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à đơn giản 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.

Xem thêm: treatment là gì

9. String và Character literals

Trong Groovy, Singly-quoted được dùng mang lại String và double-quoted được dùng mang lại String hoặc GString (nếu đem 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 biến hóa 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 đều 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 mang lạ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 đằm thắm Java và Groovy.

  • Y : Yes, Java rất có thể đem đổ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ị quăng quật bớt
  • N : No, Không mang lạ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 rất có thể đem đổ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ị quăng quật bớt
  • B : Yes, tự động hóa boxing/unboxing N : No, ko mang lạ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ựa như Java, những keywords cũng ko được dùng như thương hiệu biến hóa.

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

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

Chỉ đem điều, nếu như vết ; được dùng, một vài IDE tiếp tục khắc ghi 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 loa = ${result}"
    }

    static int m(Integer i) {
        100
    }

Với Groovy return ở một method không thể là cần. 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ị và đơn giản.

Tất nhiên , nó ko Tức là tất cả chúng ta tiếp tục quăng quật return, vì 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 rất có thể quăng quật qua

.class suffix rất có thể bỏ dở Khi pass như parameter. Như Person.class ví dụ mặt mũi dưới

    static void main(String[] args) {

        // rất có thể hiểu là Person.class
        def p = newInstance(Person)  
        println p.name
    }

    static Person newInstance(Class<Person> 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ị và đơn giản chỉ việc như sau

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

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

Xem thêm: bunker là gì

Tổng kết

Trên phía trên đơn giản những gì bản thân thăm dò hiểu và ghi chép lại theo đòi ý hiểu của bạn dạng đằm thắm và một vài loại được vận dụng Khi thao tác làm việ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ó đưa đến sự cộc gọn gàng giản dị và đơn giản vô cú pháp trình diễn. Sẽ chung tất cả chúng ta trở nên tân tiến phần mềm 1 phần nào là ê nhanh gọn lẹ rộng lớn, một Khi Grails càng ngày càng phổ biến

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