Varlık alanı olarak Kotlin satır içi sınıflı oda veritabanı


11

Oda ( https://developer.android.com/topic/libraries/architecture/room ) Jake Whartons makalesi Inline Classes Make Great Database ID'lerde açıklandığı gibi Kotlin'in satır içi sınıflarıyla çalışmayı deniyorum :

@Entity
data class MyEntity(
    @PrimaryKey val id: ID,
    val title: String
)

inline class ID(val value: String)

Bu Odayı derlerken,

Kuruluşlar ve Pojos'un kullanılabilir bir kamu kurucusu olmalıdır. Boş bir kurucuya veya parametreleri alanlarla eşleşen bir kurucuya sahip olabilirsiniz (ada ve türe göre).

Oluşturulan Java koduna bakarak buldum:

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);
}

Gizemli bir şekilde varsayılan kurucu şimdi özel.

(Veya a ) Stringiçin bir tür olarak kullanıldığında , oluşturulan Java sınıfı yapıcısı beklenen gibi görünür:idtypealias

public MyEntity(@NotNull String id, @NotNull String title) {
  Intrinsics.checkParameterIsNotNull(id, "id");
  Intrinsics.checkParameterIsNotNull(title, "title");
  super();
  this.id = id;
  this.title = title;
}

Birisi şimdi Inline Classes'ı veri varlığı özellikleri olarak kullanırken varsayılan kurucuyu nasıl herkese açık tutmalı?


1
Bazı sorun izleyicide bunun için bir sorun ortaya çıkardınız mı? Bunun kesin olarak açıklığa kavuşturulması gerektiğini tahmin ediyorum
K.O

Yanıtlar:


0

Nedeni, ID sınıfının çalışma zamanında String olarak temsil edileceğine inanıyorum. Bu yüzden $ constructor_marker ek parametresi, MyEntity (String id, String title) yapıcı imzasının benzersizliğini garanti etmektir, çünkü bu kurucu zaten tanımlanmış olabilir. Ama ben sadece burada spekülasyon yapıyorum.

Bu kurucuyu MyEntity sınıfında açıkça tanımlamaya ve çalışıp çalışmadığına bakmaya çalışabilir misiniz?


Bu kurucu zaten açıklanmıştır (ancak sözdizimsel şeker ile)data class MyEntity(@PrimaryKey val id: ID, val title: String)
whlk

1
(ID, String) parametreleri ile bir yapıcı tanımladım, (String, String) ile bir yapıcı demek istedim. Denedim ama mümkün değil gibi görünüyor. "Platform bildirimi çakışması" hatası aldım.
Diego Marin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.