アノテーションで行っているのと同じように使用@Canonical
して最初のクラスオブジェクトを定義すると、次のコンストラクターが生成されます。def
startDate
@Canonical
class MyClass {
def startDate
def additionalProperties = [:]
def void propertyMissing(String name, value) {
additionalProperties[name] = value
}
}
// use reflection to see the constructors
MyClass.class.getConstructors()
生成されたコンストラクター:
public MyClass()
public MyClass(java.lang.Object)
public MyClass(java.util.LinkedHashMap)
public MyClass(java.lang.Object,java.lang.Object)
@Canonical
ドキュメントでは、次の制限を確認できます。
最初のプロパティのタイプが LinkedHashMap の場合、または単一の Map、AbstractMap、または HashMap プロパティがある場合、Groovy の通常のマップ スタイルの命名規則は使用できません。
が生成されるため、public MyClass(java.util.LinkedHashMap)
使用できずtuple-constructor
、 が得られMissingPropertyException
ます。
驚くべきことに、 を使用する代わりに を使用してfirst
オブジェクト ( と言うことに注意してください) を定義すると、注釈は を追加せず、呼び出しが機能します。次のコードを参照してください。first
type
def
@Canonical
public MyClass(java.util.LinkedHashMap)
tuple-constructor
@Canonical
class MyClass {
java.util.Date startDate
def additionalProperties = [:]
def void propertyMissing(String name, value) {
additionalProperties[name] = value
}
}
// get the constructors
MyClass.class.getConstructors()
// now your code works
def thing = new MyClass(startDate: new java.util.Date(), duration: 1234)
作成されたコンストラクターは次のとおりです。
public MyClass()
public MyClass(java.util.Date)
public MyClass(java.util.Date,java.lang.Object)
というわけpublic MyClass(java.util.LinkedHashMap)
で制限がかからないので問題なくtuple-constructor
動作します。
さらに、このソリューションが機能するため、理由について議論することはできません...@Canonical
ドキュメントを何度も読みましたが、この動作が説明されている部分が表示されないため、なぜこれが機能するのかわかりません方法、また、いくつかの試行を行いますが、first
要素が作成された場合にのみ少し混乱します。def
public MyClass(java.util.LinkedHashMap)
@Canonical
class MyClass {
def a
int c
}
// get the constructors
MyClass.class.getConstructors()
def
...として定義された最初のオブジェクト
public MyClass()
public MyClass(java.lang.Object)
public MyClass(java.util.LinkedHashMap) // first def...
public MyClass(java.lang.Object,int)
順序を変更すると、次のようになります。
@Canonical
class MyClass {
int c
def a
}
// get the constructors
MyClass.class.getConstructors()
最初は生成されずdef
、public MyClass(java.util.LinkedHashMap)
生成されません。
public MyClass()
public MyClass(int)
public MyClass(int,java.lang.Object)
お役に立てれば、