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?
Réponses:
Je crois que la raison en est que la classe ID sera représentée sous forme de chaîne lors de l'exécution. Ainsi, le paramètre supplémentaire $ constructor_marker est de garantir l'unicité de la signature du constructeur MyEntity (String id, String title), car ce constructeur aurait déjà pu être défini. Mais je ne fais que spéculer ici.
Pourriez-vous essayer de définir explicitement ce constructeur dans la classe MyEntity et voir si cela fonctionne?
la source
data class MyEntity(@PrimaryKey val id: ID, val title: String)