Saya mencoba mendapatkan Room ( https://developer.android.com/topic/libraries/architecture/room ) bekerja dengan kelas inline Kotlin seperti yang dijelaskan dalam artikel Jake Whartons artikel Kelas Inline Membuat ID Database yang Hebat :
@Entity
data class MyEntity(
@PrimaryKey val id: ID,
val title: String
)
inline class ID(val value: String)
Saat menyusun Kamar ini mengeluh itu
Entitas dan Pojo harus memiliki konstruktor publik yang dapat digunakan. Anda dapat memiliki konstruktor kosong atau konstruktor yang parameternya cocok dengan bidang (berdasarkan nama dan jenis).
Melihat ke kode Java yang dihasilkan saya menemukan:
private MyEntity(String id, String title) {
this.id = id;
this.title = title;
}
// $FF: synthetic method
public MyEntity(String id, String title, DefaultConstructorMarker $constructor_marker) {
this(id, title);
}
Secara misterius konstruktor default bersifat pribadi sekarang.
Saat menggunakan String
sebagai tipe untuk id
(atau a typealias
), konstruktor kelas Java yang dihasilkan tampak seperti yang diharapkan:
public MyEntity(@NotNull String id, @NotNull String title) {
Intrinsics.checkParameterIsNotNull(id, "id");
Intrinsics.checkParameterIsNotNull(title, "title");
super();
this.id = id;
this.title = title;
}
Apakah seseorang sekarang bagaimana membuat konstruktor default tetap publik saat menggunakan Kelas Inline sebagai properti entitas data?
Jawaban:
Saya percaya alasannya adalah bahwa kelas ID akan direpresentasikan sebagai String dalam runtime. Jadi parameter tambahan $ constructor_marker adalah untuk menjamin keunikan tanda tangan konstruktor MyEntity (String id, String title), karena konstruktor ini sudah dapat didefinisikan. Tapi saya hanya berspekulasi di sini.
Bisakah Anda mencoba mendefinisikan konstruktor ini secara eksplisit di kelas MyEntity dan melihat apakah itu berfungsi?
sumber
data class MyEntity(@PrimaryKey val id: ID, val title: String)