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 getter
và setter
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 đổiC
: Yes, tuy nhiên cần thiết cast một cơ hội tường minhT
: Yes, tuy nhiên tài liệu có khả năng sẽ bị vứt bớtN
: 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 đổiD
: Yes, tự động hóa quy đổi Khi compile hoặc cần thiết cast một cơ hội tường minhT
: Yes, tuy nhiên tài liệu có khả năng sẽ bị vứt bớtB
: Yes, tự động hóa boxing/unboxingN
: 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