28/09/2018, 13:27

Groovy và Java, những điều khác biệt

Một project gồm groovy và java được mở bằng IntelliJ Đây là một vài viết thiên hướng nhiều về kỹ thuật mà mình viết về Groovy và Java. Với mình. Java là một ngôn ngữ mà mình tiếp xúc khá sớm và có thời gian sử dụng nó cũng khá là lâu. Tuy không là một Java Programer chính hiệu vì ...

Một project gồm groovy và java được mở bằng IntelliJMột project gồm groovy và java được mở bằng IntelliJ

Đây là một vài viết thiên hướng nhiều về kỹ thuật mà mình viết về Groovy và Java. Với mình. Java là một ngôn ngữ mà mình tiếp xúc khá sớm và có thời gian sử dụng nó cũng khá là lâu. Tuy không là một Java Programer chính hiệu vì mình sử dụng Java cho công việc lập trình Android là chính, sử dụng bộ core Java SE là chính chứ chưa đụng chạm nhiều đến Java EE.

Groovy, nó đối với mình là một thứ khá mới mẽ. Nó có cách tổ chức cú pháp gần giống Ruby vì mình cũng là một lập trình viên Ruby đã làm 1 vài dự án liên quan đến Ruby.

Cho nên bài viết này mình sẽ cố gắng không đi quá sâu vào những từ ngữ mang tính kỹ thuật, mình sẽ viết theo cách hiểu của mình. Cho nên cách bạn cứ thẳng thắn góp ý ở phần Comment.

Những điểm khác biệt

1. Không sử dụng dấu ;

Nếu các bạn đã từng dùng qua C, C++, C# thì các bạn sẽ thấy là cú pháp của các ngôn ngữ trên bắt buộc sử dụng dấu ; nhắm thông báo cho trình biên dịch là đã kết thúc 1 statement. Với Groovy, điều đó là không bắt buộc nữa. Dĩ nhiên là Groovy hổ trợ đến 99% cú pháp của Java nên sẽ rất dễ dàng nếu copy code của Java và chạy trên Groovy.

2. Return không là một keyword bắt buộc

Với Groovy, kết quả của biểu thức cuối cùng được tính toán trong một hàm có thể được trả về mà không cần từ khóa return. điều này làm cho cú pháp được ngắn gọn, dễ đọc, đặc biệt là với các hàm ngắn hoặc closures.

Theo mình thì các bạn nên sử dụng song song việc có return và không có return. Vì đôi khi từ khóa return sẽ làm cho code của bạn dễ đọc hơn.

Các bộ từ khóa lặp, điều kiện cũng có thể áp dụng điều này

3. Def and type

Rất nhiều lập trình viên, lẫn cả chính mình sử dụng từ khóa def. Trong Groovy. def không cần thiết.

Đừng viết:

def String name = "Guillaume"

nhưng:

String name = "Guillaume"

Khi định nghĩa một phương thức với untype parameters, thay vì viết

void doSomething(def param1, def param2) { … }

Thì bạn nên viết

void doSomething(param1, param2) { }

4. Public by default

Mặc định, Groovy hiểu rằng các classes và methods đều mang modifier là public. Trong trường hợp bạn không muốn method đó hoặc class đó là public, thì bạn nên đặt vào đó một modifer keyword

Thay vì viết:

public class Server { public String toString() { return “a server” } }

Nên viết:

class Server { String toString() { “a server” } }

Groovy hổ trợ package scope annotation nhằm set một biến chỉ public trong package đó.

class Server { @PackageScope Cluster cluster }

Tương tự Ruby. Groovy giúp bạn có thể bỏ các dấu () để đánh dấu parameters

println “Hello” method a, b

thay vì viết:

println(“Hello”) method(a, b)

Dĩ nhiên là trong một vài trường hợp. Groovy không cho phép bạn bỏ cặp dấu ngoặc đơn, như ví dụ sau:

def foo(n) { n } println foo 1 // won’t work def m = foo 1

Đơn giản vì lúc đó Groovy sẽ dễ dàng nhầm tưởng là foo và 1 cùng là tham số đầu vào của hàm println

5. The .class suffix is not needed

Tiếp vị ngữ .class cho một Class Name không cần nữa. Thay vào đó các bạn sẽ dễ dàng viết

Ví dụ như

connection.doPost(BASE_URI + “/modify.hqu”, params, ResourcesResponse.class)

Có thể viết thành

connection.doPost(“${BASE_URI}/modify.hqu”, params, ResourcesResponse)

6. Getters and Setters

Tương tự như C#, Getter và Setter trong Groovy được gọi là ‘property’ và nó làm cho công việc ghi và đọc một field từ một Object dễ dàng hơn

resourceGroup.getResourcePrototype().getName() SERVERTYPENAME resourceGroup.resourcePrototype.nameSERVERTYPENAME resourcePrototype.setName(“something”) resourcePrototype.name = “something”

Trong một Groovy Bean. Thay vì bạn có thể viết:

class Person { private String name String getName() { return name } void setName(String name) { this.name = name } }

Bạn có thể viết đơn giản hơn

class Person { String name }

7. Initializing beans with named parameters and the default constructor

Với một Bean như thế này

class Server { String name Cluster cluster }

Bạn hoàn toàn có thể viết theo phong cách Java như sau.

def server = new Server() server.name = “Obelix” server.cluster = aCluster

Nhưng với Groovy bạn có thể viết như sau mà không cần khai báo hàm khởi tạo có tham số

def server = new Server(name: “Obelix”, cluster: aCluster)

8. Using with() for repeated operations on the same bean

Bạn rất ghét phải gọi tên của một Bean một cách lặp lại liên tục như sau

server.name = application.name server.status = status server.sessionCount = 3 server.start() server.stop()

Bạn có thể viết

server.with { name = application.name status = status sessionCount = 3 start() stop() }

9. Equals and

Trong Java, bạn không thể so sánh hai Object bằng dấu . Với Groovythì điều này đã có thể

Bằng việc sử dụng phương thức equal() trong Java, bạn có thể sử dụng toán tử để so sánh. Nó sẽ bao gồm cả việc kiểm tra giá trị null mà Java không làm được.

Thay vì:

status != null && status.equals(ControlConstants.STATUS_COMPLETED)

Có thể viết

status ControlConstants.STATUS_COMPLETED

10. GStrings (interpolation, multiline)

Để nối các string với nhau, trong Java sử dụng dấu +, nhưng trong Groovy có thể viết khác đi một cách dễ dàng hơn.

Java

throw new Exception(“Unable to convert resource: ” + resource)

Groovy

throw new Exception(“Unable to convert resource: ${resource}”)

hoặc

throw new Exception(“Unable to convert resource: $resource”)

11. Native syntax for data structures

Groovy hỗ trợ một số hàm khởi tạo cho các cấu trúc dữ liệu như lists, maps, regex…. Nên cố gắng sử dụng nó trong các chương trình Groovy của bạn.

Đây là một vài ví dụ:

def list = [1, 4, 6, 9] // by default, keys are Strings, no need to quote them // you can wrap keys with () like [(variableStateAcronym): stateName] to insert a variable or object as a key. def map = [CA: ‘California’, MI: ‘Michigan’] def range = 10..20 def pattern = ~/fo*/ // equivalent to add() list << 5 // call contains() assert 4 in list assert 5 in list assert 15 in range // subscript notation assert list[1] 4 // add a new key value pair map << [WA: ‘Washington’] // subscript notation assert map[‘CA’] ‘California’ // property notation assert map.WA ‘Washington’ // matches() strings against patterns assert ‘foo’ =~ pattern

12. The power of switch

Switch trong Groovy rất thú vị vì các case của nó được mở rộng rất nhiều. Ví dụ

def x = 1.23 def result = “” switch (x) { case “foo”: result = “found foo” // lets fall through case “bar”: result += “bar” case [4, 5, 6, ‘inList’]: result = “list” break case 12..30: result = “range” break case Integer: result = “integer” break case Number: result = “number” break default: result = “default” } assert result “number”

13. Import aliasing

Trong Java. Nếu có 2 class cùng tên. Bạn vẫn có thể import chúng vào code của bạn. Nhưng phải sử dụng fullname của nó khi sử dụng. Groovy đã khắc phục chuyện này bằng việc sử dụng Import aliasing

import Java.util.List as juList import java.awt.List as aList import Java.awt.WindowConstants as WC

Bạn cũng có thể import một static method:

import static pkg.SomeClass.foo foo()

14. Groovy Truth

Mọi đối tượng trong Groovy có thể đưa về giá trị kiểu boolean. null, void và empty sẽ bị xem là false còn lại là true.

Thay vì viết

if (name != null && name.length > 0) {}

có thể viết

if (name) {}

Trong trường hợp bạn muốn tùy biến Groovy Truth, bạn có thể overide hàm asBoolean

15. Safe graph navigation

Trong Java, muốn làm 1 hành động gì đó với một Object, bạn phải check null. Với Groovy thì nó đã hổ trợ bạn chuyện đó

if (order != null) { if (order.getCustomer() != null) { if (order.getCustomer().getAddress() != null) { System.out.println(order.getCustomer().getAddress()); } } }

Với toán tử kiểm tra ?., bạn có thể viết đơn giản.

println order?.customer?.address

16. Assert

Để kiểm tra parameters, giá trị trả về… bạn có thể dùng lệnh assert

def check(String name) { // name non-null and non-empty according to Groovy Truth assert name // safe navigation + Groovy Truth to check assert name?.size() > 3 }

17. Elvis operator for default values

Trong Java các bạn viết

def result = name != null ? name : “Unknown”

Nhưng với Groovy

def result = name ?: “Unknown”

18. Catch any exception

Trong Java, đôi khi bạn phải dùng TryCatch và buộc phải Catch đúng loại exception

try { // … } catch (Throwable t) { // something bad happens }

với Groovy thì điều này đơn giản hơn

try { // … } catch (any) { // something bad happens }

Kết luận

Là một người từng sử dụng Ruby và Java. Mình thấy Groovy có sự pha trộn giữa cả 2 ngôn ngữ. Nó có rất nhiều cái hay và thú vị. Mình học nó vì nó gần gũi với cả Java và Ruby, nó mang sức mạnh của Java và sự tính tế của Ruby, Và nó là ngôn ngữ cho Grails. Một framework mạnh mẽ. Vậy thì tại sao không bắt tay vào thử tìm hiểu nó xem.

Nguồn: http://bit.ly/16BA4zl

Techtalk via kimhieu

0