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?