2016-08-01 13 views

Antwort

1

Sie können in den Attributen in der Klassendeklaration ausfüllen:

@groovy.transform.Immutable 
class Person { 
    String name = 'john' 
} 

p = new Person(name: 'percy') 
assert p.name == 'percy' 

p2 = new Person() 
assert p2.name == 'john' 

Update: Groovy schlägt fehl, wenn alle Setter nach dem Erstellen des Objekts verwendet wird.

try { 
    p2.name = 'echo' 
    assert p2.name == 'echo' 
    assert false 
} catch(e) { 
    assert true 
} 

Update 2: Ah, groovyConsole zur Rettung. @Immutable setzt das Feld name im Konstruktor, daher ist das Feld tatsächlich endgültig.

enter image description here

+0

Ah, aus irgendeinem Grund, den ich hatte den Eindruck, dass diese Felder waren 'final' (mein schlecht). Vielen Dank. – phani

+2

Die Felder * sind * endgültig. In dem Beispiel gibt es nichts, was darauf hindeutet, dass dies nicht der Fall ist. Doc: http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/Immutable.html –

+0

@MichaelOster Im obigen Beispiel wird dem Feld 'name' zweimal ein Wert zugewiesen: einmal zu der Zeit der Deklaration und ein weiteres Mal im impliziten map-basierten Konstruktor. Das ist für 'final' Variablen nicht erlaubt (zumindest in Java; ich bin neu in Groovy). Bitte korrigieren Sie mich, wenn ich etwas verpasse. – phani