Почему Groovy заменяет java.lang.String.length() с помощью size()?

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?
  • Как насчет других стандартных классов?

Ответ 1

Groovy добавляет множество методов в строки и всевозможные другие классы. Все удобные методы являются частью того, почему Groovy отлично.

java.lang.String реализует java.lang.CharSequence, и там, где он получает всю (большую часть) магию. size(), например. Groovy добавляет метод size() к большинству объектов, которые могут иметь что-то, что вы считаете размером, чтобы вы могли использовать согласованный метод по всем направлениям. length() все еще полностью допустим, Groovy не удаляет это.

Чтобы увидеть, как некоторые из методов Groovy добавляются, проверьте GDK, и особенно CharSequence и Collection.

Ответ 2

Я предлагаю вам прочитать документ Groovy class StringGroovyMethods, он дает простые объяснения того, как все работает с Groovy.

Статические методы используются с первым параметром, являющимся целевым классом, например. public static String reverse (String self) предоставляет метод reverse() для String.