di current article circa il linguaggio di programmazione Groovy Wikipedia spiega che "La maggior parte dei file Java validi sono anche i file Groovy validi" e fornisce i seguenti esempi, prima di codice Java:Perché Groovy sostituisce java.lang.String.length() con size()?
for (String it : new String[] {"Rod", "Carlos", "Chris"})
if (it.length() <= 4)
System.out.println(it);
poi lo stesso in Groovy:
["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it}
Avviso nel primo esempio che abbiamo usato il metodo Java perfettamente ordinario, java.lang.String.length(). Nel secondo esempio questo metodo è stato misteriosamente sostituito con una chiamata a un metodo chiamato size()
. Ho verified che il secondo esempio è codice Groovy valido e ha il comportamento corretto.
java.lang.String
non ha un metodo denominato size()
. Groovy non sottoclasse String
per i propri scopi:
String s = ""
Class c = s.getClass()
println c.getName() // "java.lang.String"
né in qualche modo aggiungere metodi aggiuntivi per l'oggetto String
:
// [...]
for (def method : c.getMethods()) {
println method.getName()
}
// prints a whole bunch of method names, no "size"
e ancora questo codice funziona in qualche modo:
// [...]
println s.size() // "0"
Non riesco a trovare alcuna documentazione di Groovy per spiegarlo.
- Da dove proviene ?
- Perché non appare sull'oggetto?
- Perché è stato aggiunto?
- Cosa c'era di sbagliato con
length()
e perché non è preferibile? - Quali altri metodi aggiuntivi sono stati aggiunti a
java.lang.String
? - E le altre classi standard?
Solo una rapida ipotesi: Groovy potrebbe utilizzare il proprio [metaprogramming] (https://en.wikipedia.org/wiki/Groovy_%28programming_language%29#Metaprogramming) per una magia come questa. – JimmyB
E [questo] (http://docs.groovy-lang.org/latest/html/api/org/codehaus/groovy/runtime/StringGroovyMethods.html#size%28java.lang.String%29) è dove viene da apparentemente. [Qui] (http://docs.groovy-lang.org/latest/html/api/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.html) puoi vedere quali altre classi/metodi ci sono. – JimmyB
"Cosa c'era di sbagliato nella lunghezza()?" - Ho sempre pensato che 'length()' non fosse realmente consistente (molto meno 'Array.length'!) Mentre l'API delle collezioni usa' size() '. – JimmyB