2015-07-15 14 views
10

Wikipedia current article về ngôn ngữ lập trình Groovy giải thích rằng "Hầu hết các file Java hợp lệ cũng là các tập tin Groovy hợp lệ" và đưa ra các ví dụ sau đây, trước hết là mã Java:Tại sao Groovy thay thế java.lang.String.length() bằng size()?

for (String it : new String[] {"Rod", "Carlos", "Chris"}) 
    if (it.length() <= 4) 
     System.out.println(it); 

Sau đó, cùng trong Groovy:

["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it} 

Lưu ý trong ví dụ đầu tiên mà chúng tôi đã sử dụng phương pháp Java hoàn toàn bình thường, java.lang.String.length(). Trong ví dụ thứ hai, phương pháp này đã được thay thế một cách bí ẩn bằng một cuộc gọi đến một phương thức có tên là size(). Tôi có verified rằng ví dụ thứ hai là mã Groovy hợp lệ và có hành vi đúng.

java.lang.String không có phương thức được gọi là size(). Groovy không phân lớp String cho mục đích riêng của nó:

String s = "" 
Class c = s.getClass() 
println c.getName() // "java.lang.String" 

cũng không bằng cách nào đó thêm các phương pháp bổ sung cho các String đối tượng:

// [...] 
for (def method : c.getMethods()) { 
    println method.getName() 
} 
// prints a whole bunch of method names, no "size" 

nhưng vẫn mã này bằng cách nào đó hoạt động:

// [...] 
println s.size() // "0" 

Tôi không thể tìm thấy bất kỳ tài liệu Groovy nào để giải thích điều này.

  • Trường hợp nào size() có nguồn gốc từ đâu?
  • Tại sao nó không xuất hiện trên đối tượng?
  • Tại sao lại được thêm vào?
  • Điều gì đã xảy ra với length() và tại sao nó không được ưu tiên?
  • Phương pháp bổ sung nào khác đã được thêm vào java.lang.String?
  • Còn các lớp tiêu chuẩn khác thì sao?
+0

Chỉ cần đoán nhanh: Groovy có thể sử dụng chính nó [metaprogramming] (https://en.wikipedia.org/wiki/Groovy_%28programming_language%29#Metaprogramming) cho ma thuật như thế này. – JimmyB

+0

Và [this] (http://docs.groovy-lang.org/latest/html/api/org/codehaus/groovy/runtime/StringGroovyMethods.html#size%28java.lang.String%29) là nơi nó đến từ rõ ràng. [Ở đây] (http://docs.groovy-lang.org/latest/html/api/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.html) bạn có thể thấy các lớp/phương pháp khác có ở đó. – JimmyB

+1

"Có gì sai với độ dài()?" - Tôi luôn cảm thấy rằng 'length()' không thực sự nhất quán (ít hơn nhiều 'Array.length'!) Trong khi API bộ sưu tập sử dụng' size() '. – JimmyB

Trả lời

0

Tôi đề nghị bạn đọc tài liệu của lớp Groovy StringGroovyMethods, nó cung cấp giải thích đơn giản về cách mọi thứ hoạt động với Groovy.

Phương pháp tĩnh được sử dụng với thông số đầu tiên là lớp đích, ví dụ: chuỗi tĩnh công cộng ngược (Chuỗi tự) cung cấp phương thức reverse() cho String.

10

Groovy thêm nhiều phương thức vào chuỗi và tất cả các loại lớp khác. Tất cả các phương pháp tiện lợi là một phần lý do tại sao Groovy là tuyệt vời.

java.lang.String triển khai java.lang.CharSequence và đó là nơi mà nó nhận được tất cả (hầu hết) ma thuật từ đó. Ví dụ: size(). Groovy thêm phương thức size() cho hầu hết các đối tượng có thể có thứ gì đó bạn muốn xem xét kích thước để bạn có thể sử dụng phương thức nhất quán trên bảng. length() vẫn hoàn toàn hợp lệ, Groovy không loại bỏ điều này.

Để xem một số phương thức mà Groovy thêm, hãy xem GDK và đặc biệt là CharSequenceCollection.

Các vấn đề liên quan