Convertir des variables statiques à partir de Java à Kotlin
Je suis en train de convertir le code suivant à Kotlin ET ont encore l'une des classes (Foo) utilisé par Java. Quelle est la bonne façon de faire cette conversion?
Original Java:
public class Foo {
public static final String C_ID = "ID";
public static final String C_NAME = "NAME";
public static final String[] VALUES = {"X", "Y", "Z"};
public static String[] getAll() {
return new String[] {C_ID, C_NAME};
}
}
public class Bar {
public void doStuff() {
String var1 = Foo.C_ID;
String[] array1 = Foo.VALUES;
String[] array2 = Foo.getAll();
}
}
Conversion automatique fo Foo de Kotlin
object Foo {
val C_ID = "ID"
val C_NAME = "NAME"
val VALUES = arrayOf("X", "Y", "Z")
val all: Array<String>
get() = arrayOf(C_ID, C_NAME)
}
Problème:
Barre de classe ne peut plus accéder aux C_ID ou de VALEURS (erreur: "accès privé")
si j'ai mis "const" en face de C_ID, ça marche... mais je ne peux pas faire la même chose avec les VALEURS ("const" ne peut être utilisé sur primatives ou Chaîne)
Est-il une autre façon pour moi de faire cela (donc à la fois le code de Java et de Kotlin code peut accéder à tout Foo)?
- bien que
const val
peut avoir l'effet dont vous avez besoin, le but est différent (compilateur constantes de temps) et il ne faut pas l'utiliser pour l'interopérabilité.
Vous devez vous connecter pour publier un commentaire.
Le courant de la sémantique viennent de Kotlin Bêta Candidat:
Conformément au présent et à l' référence, il y a trois façons de travailler avec les propriétés d'un Kotlin
object
de Java:Utilisation
Foo.INSTANCE
.Par défaut, les propriétés de
object
ne sera pas statique champs pour Java, mais Java pouvez accéder aux propriétés parFoo
instance de l'objet --Foo.INSTANCE
.Donc l'expression sera
Foo.INSTANCE.getC_ID()
.Marque une propriété avec
@JvmStatic
annotation:Cela va générer de l'électricité statique getter pour
C_ID
au lieu deFoo
exemple de lecture qui sera accessible queFoo.getC_ID()
.Utilisation
@JvmField
annotation sur la déclaration de la propriété:Cela fera Kotlin compilateur de générer un champ statique pour Java au lieu de la propriété.
Puis, en Java, vous pouvez y accéder comme un champ statique:
Foo.C_ID
.Mais il ne fonctionne pas sur les propriétés sans champs de sauvegarde comme
all
dans votre exemple.Pour les primitives, comme vous l'avez dit, on peut utiliser
const
qui aura le même effet que@JvmField
en termes de visibilité en Java.Par ailleurs, quand il s'agit de méthodes, la situation est la même, et il n'y a
@JvmStatic
annotation pour eux.Dans votre classe foo vous pouvez mettre ces propriétés et la méthode à l'intérieur d'un compagnon de l'objet:
Ensuite, vous pouvez appeler Foo.getAll(), et Foo.C_ID, Foo.C_NAME et Foo.Des VALEURS.
Vous devriez être en mesure d'accéder aux valeurs "de la kotlin chemin":
Avec comme résultat:
object
en Java, que voulez-vous dire par "Kotlin way" et pourquoi lesC_ID
etC_NAME
être accessibles par le biais de tableau?all
val. Si la question semble encore plus sur Java interop.c'est mieux si vous créez de nouveaux kotlin fichier juste pour les constantes.
créer Constantes.kt fichier et collez code ci-dessous.
dans votre activité principale, vous pouvez accéder à l'une des constantes par le nom de constante d'android studio va importer automatiquement les constantes. voici mon mainActivity:
J'ai été en mesure d'obtenir la sortie du journal avec succès