Estou tentando fazer com que o Room ( https://developer.android.com/topic/libraries/architecture/room ) trabalhe com as classes embutidas do Kotlin, conforme descrito no artigo de Jake Whartons Classes embutidas produzem ótimas IDs de banco de dados :
@Entity
data class MyEntity(
@PrimaryKey val id: ID,
val title: String
)
inline class ID(val value: String)
Ao compilar esta sala, reclama-se que
Entidades e Pojos devem ter um construtor público utilizável. Você pode ter um construtor vazio ou um construtor cujos parâmetros correspondam aos campos (por nome e tipo).
Analisando o código Java gerado, encontro:
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, o construtor padrão é privado agora.
Ao usar String
como um tipo para id
(ou a typealias
), o construtor de classe Java gerado se parece com o esperado:
public MyEntity(@NotNull String id, @NotNull String title) {
Intrinsics.checkParameterIsNotNull(id, "id");
Intrinsics.checkParameterIsNotNull(title, "title");
super();
this.id = id;
this.title = title;
}
Alguém agora como manter público o construtor padrão ao usar Classes Inline como propriedades da entidade de dados?
Respostas:
Acredito que o motivo é que a classe ID será representada como String em tempo de execução. Portanto, o parâmetro adicional $ constructor_marker é garantir a exclusividade da assinatura do construtor MyEntity (ID da string, título da string), pois esse construtor já poderia ter sido definido. Mas estou apenas especulando aqui.
Você poderia tentar definir explicitamente esse construtor na classe MyEntity e ver se funciona?
fonte
data class MyEntity(@PrimaryKey val id: ID, val title: String)