Wikipedia текущая статья о языке программирования Groovy объясняет, что "большинство допустимых файлов Java также являются действительными Groovy files" и дает следующие примеры: сначала код Java:
for (String it : new String[] {"Rod", "Carlos", "Chris"})
if (it.length() <= 4)
System.out.println(it);
Тогда то же самое в Groovy:
["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it}
Обратите внимание, что в первом примере мы использовали совершенно обычный метод Java, java.lang.String.length(). Во втором примере этот метод был загадочно заменен вызовом метода под названием size()
. У меня verified, что второй пример является допустимым Groovy кодом и имеет правильное поведение.
java.lang.String
не имеет метода, называемого size()
. Groovy не подклассы String
для собственных целей:
String s = ""
Class c = s.getClass()
println c.getName() // "java.lang.String"
и не добавляет дополнительные методы к объекту String
:
// [...]
for (def method : c.getMethods()) {
println method.getName()
}
// prints a whole bunch of method names, no "size"
и все же этот код как-то работает:
// [...]
println s.size() // "0"
Я не могу найти документацию Groovy, чтобы объяснить это.
- Откуда
size()
? - Почему он не отображается на объекте?
- Почему он был добавлен?
- Что случилось с
length()
и почему это не рекомендуется? - Какие еще дополнительные методы были добавлены в
java.lang.String
? - Как насчет других стандартных классов?