Kotlin para Android y classs internas finales estáticas

Estoy intentando reescribir mi aplicación de Android en Kotlin, y me he enfrentado a un problema al convertir la class de contrato de ContentProvider. Así que tengo una class de contrato simple (se omite todo lo pnetworkingeterminado como tipo de contenido y contenido uris):

public final class Contract { public static final class Contacts { public static final String NAME = "Name" public static final String BIRTH = "Birth" public static final String IMAGE = "Image" } } 

Si entiendo correctamente, en Kotlin no tenemos miembros estáticos. En lugar de esto, tenemos "objects de compañía". Entonces, después de convertirlo a Kotlin, tengo este código:

 object BirthdayContract { class Contacts : BaseColumns { companion object { val NAME = "Name" val BIRTH = "Birth" val IMAGE = "Image" } } } 

Pero cuando bash acceder a campos como Contract.Contacts.NAME, aparece un error: "NAME tiene acceso privado". Cambiar los modificadores de visibilidad no dio ningún efecto. Entonces, ¿hay alguna forma de utilizar tales classs de contrato en Kotlin, o es mejor mantenerlo en Java?

UPD Creo que debería aclarar: mi código de llamada también está en Kotlin. El problema estaba en la anotación @JvmField. Con él, puedo acceder a miembros estáticos directamente, sin llamar a getters.

NAME es una propiedad y, de forma pnetworkingeterminada, su campo de respaldo tiene acceso privado. Pero como es una propiedad, hay un getter para ello: getNAME() .

Como esta no es la forma natural de acceder a las constantes en Java, existen algunas maneras de exponer directamente el campo:

  1. const : const val NAME = "Name"
  2. Anotación @JvmField : @JvmField val NAME = "Name"

Para exponer constantes como campos, @JvmField con @JvmField

 class Contacts { companion object { @JvmField val NAME = "Name" @JvmField val BIRTH = "Birth" @JvmField val IMAGE = "Image" } } 

Entonces puedes usarlos de Java de esta manera:

 String name = Contacts.NAME; 

Una vez que todo su código esté en Kotlin, puede eliminar la anotación @JvmField.

Puedes hacerlo con @JvmStatic

 object BirthdayContract { class Contacts : BaseColumns { companion object { @JvmStatic val NAME = "Name" @JvmStatic val BIRTH = "Birth" @JvmStatic val IMAGE = "Image" } } } //Java BirthdayContract.Contacts.Companion.getNAME() 

Hasta ahora no veo una buena razón para extender Basecolumnas, por lo que una mejor opción sería

 object BirthdayContract { object Contacts { const val NAME = "Name" const val BIRTH = "Birth" const val IMAGE = "Image" } } //Java BirthdayContract.Contacts.NAME 

La conclusión es que los objects nesteds en kotlin no se ven limpios. Por favor considere simplificar su código

Considere usar un object simple como este:

 object Contract { object Contacts { val NAME = "Name" val BIRTH = "Birth" val IMAGE = "Image" } } 

Esto debe completar perfectamente para su código Java inicial.

En el público estable más reciente de Kotlin-Version es la visibilidad pnetworkingeterminada.

Opcionalmente, puede agregar la palabra key const para las constantes de time de compilation para que se puedan usar en las annotations .: https://kotlinlang.org/docs/reference/properties.html#compile-time-constants

La anotación @JvmStatic es para Java-Interop y si planeas completar kotlin, no la necesitarás.

  • Setter en línea o No crear setter sin usar en Kotlin?
  • Realm Nested Object sort
  • Kotlin - equivalencia a SomeClass.class para objects?
  • ¿Puede el comstackdor de Kotlin optimizar las funciones de envoltura remota?
  • ¿Cómo puedo cambiar ColorPrimaryDark para una sola actividad?
  • ¿Cómo omitir los parameters lambda en Kotlin?
  • Poniendo un lambda genérico en un map
  • Devuelve el índice doble del elemento de la colección mientras itera
  • ¿Cómo get nombres y valores de los parameters del método?
  • No se pueden volver a asignar las variables locales
  • kapt: cómo get comentarios fuente?