2015-07-15 10 views
10

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?
+0

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

+0

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

+1

"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

risposta

0

Suggerisco di leggere il documento della classe Groovy StringGroovyMethods, fornisce semplici spiegazioni su come funzionano le cose con Groovy.

I metodi statici vengono utilizzati con il primo parametro come classe di destinazione, ad esempio public static String reverse (String self) fornisce un metodo reverse() per String.

10

Groovy aggiunge molti metodi alle stringhe e a tutti i tipi di altre classi. Tutti i metodi di convenienza fanno parte del perché Groovy è fantastico.

java.lang.String strumenti java.lang.CharSequence, ed è da lì che viene ricavata tutta la (più) magia. size(), ad esempio. Groovy aggiunge un metodo size() alla maggior parte degli oggetti che possono avere qualcosa che consideri una dimensione in modo da poter utilizzare un metodo coerente su tutta la linea. length() è ancora interamente valido, Groovy non lo rimuove.

Per vedere alcuni dei metodi aggiunti da Groovy, controllare GDK e in particolare CharSequence e Collection.

Problemi correlati