Groovy 元組構造函數創建

  • 2019 年 10 月 4 日
  • 筆記

Groovy 1.8添加了@TupleConstructor注釋。 通過這個注釋,我們可以在編譯時自動創建一個元組構造函數。 因此構造函數可以在編譯的類中找到。 對於類中的每個屬性,將使用默認值創建構造函數中的參數。 類中定義的屬性的順序還定義了構造函數中參數的順序。 因為參數具有默認值,所以我們可以使用Groovy語法,並在使用構造函數時將參數留在參數列表的末尾。

我們還可以包含欄位作為構造函數參數。 我們使用注釋屬性includeFields=true來激活它。

如果我們在類中定義構造函數而不是TupleConstructor注釋將不會創建額外的構造函數。 但我們可以使用屬性值force=true覆蓋此行為。 我們必須確保自己沒有構造函數衝突,因為現在注釋將創建額外的構造函數。

如果我們的類擴展了另一個類,並且我們想要包含超類的屬性或欄位,我們可以使用屬性includeSuperPropertiesincludeSuperFields。 我們甚至可以指示注釋在構造函數中創建程式碼,以使用屬性調用超類的超級構造函數。 我們必須設置注釋屬性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']