Groovy 元組構造函數創建
- 2019 年 10 月 4 日
- 筆記
Groovy 1.8添加了@TupleConstructor
注釋。 通過這個注釋,我們可以在編譯時自動創建一個元組構造函數。 因此構造函數可以在編譯的類中找到。 對於類中的每個屬性,將使用默認值創建構造函數中的參數。 類中定義的屬性的順序還定義了構造函數中參數的順序。 因為參數具有默認值,所以我們可以使用Groovy語法,並在使用構造函數時將參數留在參數列表的末尾。
我們還可以包含欄位作為構造函數參數。 我們使用注釋屬性includeFields=true
來激活它。
如果我們在類中定義構造函數而不是TupleConstructor
注釋將不會創建額外的構造函數。 但我們可以使用屬性值force=true
覆蓋此行為。 我們必須確保自己沒有構造函數衝突,因為現在注釋將創建額外的構造函數。
如果我們的類擴展了另一個類,並且我們想要包含超類的屬性或欄位,我們可以使用屬性includeSuperProperties
和includeSuperFields
。 我們甚至可以指示注釋在構造函數中創建程式碼,以使用屬性調用超類的超級構造函數。 我們必須設置注釋屬性callSuper=true
來實現這一點。
import groovy.transform.TupleConstructor @TupleConstructor() class Person { String name List likes private boolean active = false } def person = new Person('mrhaki', ['Groovy', 'Java']) assert person.name == 'mrhaki' assert person.likes == ['Groovy', 'Java'] person = new Person('mrhaki') assert person.name == 'mrhaki' assert !person.likes // includeFields in the constructor creation. import groovy.transform.TupleConstructor @TupleConstructor(includeFields=true) class Person { String name List likes private boolean active = false boolean isActivated() { active } } def person = new Person('mrhaki', ['Groovy', 'Java'], true) assert person.name == 'mrhaki' assert person.likes == ['Groovy', 'Java'] assert person.activated // use force attribute to force creation of constructor // even if we define our own constructors. import groovy.transform.TupleConstructor @TupleConstructor(force=true) class Person { String name List likes private boolean active = false Person(boolean active) { this.active = active } boolean isActivated() { active } } def person = new Person('mrhaki', ['Groovy', 'Java']) assert person.name == 'mrhaki' assert person.likes == ['Groovy', 'Java'] assert !person.activated person = new Person(true) assert person.activated // include properties and fields from super class. import groovy.transform.TupleConstructor @TupleConstructor(includeFields=true) class Person { String name List likes private boolean active = false boolean isActivated() { active } } @TupleConstructor(callSuper=true, includeSuperProperties=true, includeSuperFields=true) class Student extends Person { List courses } def student = new Student('mrhaki', ['Groovy', 'Java'], true, ['IT']) assert student.name == 'mrhaki' assert student.likes == ['Groovy', 'Java'] assert student.activated assert student.courses == ['IT']