はのは、データクラスのクラスを見てみましょう:Kotlinはゼロに引数にデフォルト値を設定し、コンストラクタを生成
data class User(
val userNumber: Int = -1,
val name: String,
val userGroups; List<String> = emptyList(),
val screenName: String = "new-user"
)
Kotlinからこの関数を呼び出して、それは非常に簡単です。私は単純に名前付き引数の構文を使用してこれを行うことができます。 、今
User(int userNumber, @NotNull String name, @NotNull List userGroups,
@NotNull String screenName)
User(int userNumber, @NotNull String name, @NotNull List userGroups)
User(int userNumber, @NotNull String name)
User(@NotNull String name)
:ジャワからの呼び出し、私はすべての値を指定する必要があり、または(デフォルト値のビットマスクで生成kotlinコンストラクタに加えて)次のコンストラクタを生成@JvmOverloads
注釈を使用します私がと同等のJavaでUser
オブジェクトを作成したいのであれば、上記のコンストラクタではできません。私はval userNumber: Int = -1
を末尾にdata class
宣言(コンストラクタの生成はオプションの引数が定義されている順序に依存しているように見える)の末尾に置くとできます。これはうまくいきます。なぜなら、kotlinがすべての順列を生成することが、いくつかのクラスを大きく膨らませることになるからです。
彼らはコンストラクタが使用(と私は、特別に生成されたものの一つに注釈を付けることができます好きではない)する見当がつかないようJackson
のようなツールは、単に動作しない最大の問題。現在、私は、上記のアプローチを使用していますが、手動で、私はそれらを必要とするコンストラクタを定義する
User(Integer userNumber, String name, List<String> userGroups, String screenName) {
this.userNumber = (userNumber == null) ? -1 : userNumber;
this.userGroups = (userGroups == null) ? Collections.emptyList() : userGroups;
//...
}
:
だから、のような(単一)コンストラクタを生成する方法があります。署名の両方がJVM上で衝突しまうので、私は明らかに、同様のコンストラクタが動作しないの作成、明確にすべき
EDIT
。これは私の場合に欲しいものです:
また、プロパティのデフォルト値を2回書く必要があることにも注意してください。私はそれを見ているので、私はそこに解決策があるのか疑問だ。たぶんこれはkapt
ベースの私のサイドプロジェクトの良いユースケースです:
あなたはジャクソン・モジュールkotlin(https://github.com/FasterXML/jackson-module-kotlin)を使用していますか?私はデフォルトのパラメータを持つコンストラクタを扱うことができると思います。 Javaでのあなたの問題については確かではありません。おそらく二次コンストラクタを使用しますか? – Strelok
私はJavaには実際には問題はありませんが、jacksonでしかありません。あなたは正しいですが、私は単純に二次コンストラクタを使用できます(技術的には、上記の静的メソッドは二次コンストラクタに似ています)。チェックアウト 'jackson-module-kotlin' ... –