Sto cercando di far funzionare Room ( https://developer.android.com/topic/libraries/architecture/room ) con le classi inline di Kotlin come descritto nell'articolo di Jake Whartons Classi inline Crea grandi ID del database :
@Entity
data class MyEntity(
@PrimaryKey val id: ID,
val title: String
)
inline class ID(val value: String)
Quando si compila questa stanza si lamenta che
Entità e Pojo devono avere un costruttore pubblico utilizzabile. Puoi avere un costruttore vuoto o un costruttore i cui parametri corrispondono ai campi (per nome e tipo).
Osservando il codice Java generato trovo:
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);
}
Misteriosamente il costruttore predefinito è privato ora.
Quando si utilizza String
come tipo per id
(o a typealias
), il costruttore della classe Java generato appare come previsto:
public MyEntity(@NotNull String id, @NotNull String title) {
Intrinsics.checkParameterIsNotNull(id, "id");
Intrinsics.checkParameterIsNotNull(title, "title");
super();
this.id = id;
this.title = title;
}
Qualcuno ora come mantenere pubblico il costruttore predefinito mentre utilizza le classi inline come proprietà dell'entità dati?