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?
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
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
"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