J'essaie de faire fonctionner Room ( https://developer.android.com/topic/libraries/architecture/room ) avec les classes en ligne de Kotlin comme décrit dans l' article de Jake Whartons Les classes en ligne font de grands ID de base de données :
@Entity
data class MyEntity(
@PrimaryKey val id: ID,
val title: String
)
inline class ID(val value: String)
Lors de la compilation de cette salle se plaint que
Les entités et les Pojos doivent avoir un constructeur public utilisable. Vous pouvez avoir un constructeur vide ou un constructeur dont les paramètres correspondent aux champs (par nom et type).
En regardant dans le code Java généré, je trouve:
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);
}
Mystérieusement, le constructeur par défaut est désormais privé.
Lors de l'utilisation String
comme type pour id
(ou a typealias
), le constructeur de classe Java généré ressemble à celui attendu:
public MyEntity(@NotNull String id, @NotNull String title) {
Intrinsics.checkParameterIsNotNull(id, "id");
Intrinsics.checkParameterIsNotNull(title, "title");
super();
this.id = id;
this.title = title;
}
Est-ce que quelqu'un maintenant comment garder le constructeur par défaut public tout en utilisant des classes en ligne comme propriétés d'entité de données?