¿Por qué Groovy reemplaza java.lang.String.length() con size()?
groovy substring (2)
Groovy agrega muchos métodos a cadenas y todo tipo de otras clases. Todos los métodos de conveniencia son parte de por qué Groovy es genial.
java.lang.String
implementa java.lang.CharSequence
, y de ahí obtiene la mayor parte de la magia. size()
, por ejemplo. Groovy agrega un método de size()
a la mayoría de los objetos que pueden tener algo que consideraría un tamaño para que pueda usar un método uniforme en todos los ámbitos. length()
sigue siendo completamente válido, Groovy no elimina esto.
Para ver algunos de los métodos que Groovy agrega, consulte el GDK , y particularmente CharSequence y Collection .
El artículo actual de Wikipedia sobre el lenguaje de programación Groovy explica que "La mayoría de los archivos Java válidos también son archivos válidos de Groovy" y ofrece los siguientes ejemplos, primero del código de Java:
for (String it : new String[] {"Rod", "Carlos", "Chris"})
if (it.length() <= 4)
System.out.println(it);
Entonces lo mismo en Groovy:
["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it}
Observe en el primer ejemplo que utilizamos el método Java perfectamente normal, java.lang.String.length () . En el segundo ejemplo, este método ha sido misteriosamente reemplazado por una llamada a un método llamado size()
. He verificado que el segundo ejemplo es código válido de Groovy y tiene el comportamiento correcto.
java.lang.String
no tiene un método llamado size()
. Groovy no subclase String
para sus propios fines:
String s = ""
Class c = s.getClass()
println c.getName() // "java.lang.String"
ni agrega de alguna manera métodos adicionales al objeto String
:
// [...]
for (def method : c.getMethods()) {
println method.getName()
}
// prints a whole bunch of method names, no "size"
y aún así, este código funciona de alguna manera:
// [...]
println s.size() // "0"
No puedo encontrar ninguna documentación de Groovy para explicar esto.
- ¿De dónde viene el
size()
? - ¿Por qué no aparece en el objeto?
- ¿Por qué fue agregado?
- ¿Qué estuvo mal con la
length()
y por qué no se prefiere? - ¿Qué otros métodos adicionales se han agregado a
java.lang.String
? - ¿Qué pasa con otras clases estándar?
Le sugiero que lea el documento de la clase Groovy StringGroovyMethods
, le da explicaciones simples de cómo funcionan las cosas con Groovy.
Los métodos estáticos se usan con el primer parámetro siendo la clase de destino, ej. public static String reverse (String self) proporciona un método reverse () para String.