Estoy tratando de hacer que Room ( https://developer.android.com/topic/libraries/architecture/room ) funcione con las clases en línea de Kotlin como se describe en el artículo de Jake Whartons. Las clases en línea son excelentes ID de bases de datos :
@Entity
data class MyEntity(
@PrimaryKey val id: ID,
val title: String
)
inline class ID(val value: String)
Al compilar esta sala se queja de que
Las entidades y los Pojos deben tener un constructor público utilizable. Puede tener un constructor vacío o un constructor cuyos parámetros coincidan con los campos (por nombre y tipo).
Buscando en el código Java generado encuentro:
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, el constructor predeterminado es privado ahora.
Cuando se usa String
como tipo para id
(o a typealias
), el constructor de clase Java generado se ve como se esperaba:
public MyEntity(@NotNull String id, @NotNull String title) {
Intrinsics.checkParameterIsNotNull(id, "id");
Intrinsics.checkParameterIsNotNull(title, "title");
super();
this.id = id;
this.title = title;
}
¿Alguien ahora cómo mantener público el constructor predeterminado mientras se utilizan las clases en línea como propiedades de entidad de datos?
Respuestas:
Creo que la razón es que la clase ID se representará como String en tiempo de ejecución. Entonces, el parámetro adicional $ constructor_marker es garantizar la unicidad de la firma del constructor MyEntity (String id, String title), porque este constructor ya podría haberse definido. Pero solo estoy especulando aquí.
¿Podría intentar definir explícitamente este constructor en la clase MyEntity y ver si funciona?
fuente
data class MyEntity(@PrimaryKey val id: ID, val title: String)