web-dev-qa-db-fra.com

Kotlin: Comment accéder au champ depuis une autre classe?

package example

class Apple {
    val Apple_SIZE_KEY: String = "Apple_SIZE_KEY"
}

Classe:

package example

class Store {
     fun buy() {
      val SIZE = Apple.APPLE_SIZE_KEY
    }
}

Erreur:

'Apple_SIZE_KEY' a un accès privé dans 'example.Apple'

Mais documentation officielle décrit que si nous ne spécifions aucun modificateur de visibilité, public est utilisé par défaut.

Pourquoi l'erreur ci-dessus arrive-t-elle?

7
Malwinder Singh

Ce que vous essayez de faire, c'est d'accéder à une valeur d'une classe qui n'a pas d'instance. Voici trois solutions:

package example

object Apple {
    val Apple_SIZE_KEY: String = "Apple_SIZE_KEY"
}

De cette façon, vous n'avez pas besoin d'instancier quoi que ce soit à cause de la façon dont objects fonctionne dans Kotlin.

Vous pouvez également instancier votre classe comme ceci:

package example

class Store {
     fun buy() {
      val SIZE = Apple().Apple_SIZE_KEY
    }
}

Dans cette solution, vous avez également un objet de Apple, mais Apple est toujours déclaré en tant que classe.

La troisième option est un objet compagnon, qui se comporte comme des variables statiques en Java.

package example

class Apple {
    companion object {
        val Apple_SIZE_KEY: String = "Apple_SIZE_KEY"
    }
}

Si vous voulez que ce soit une propriété de niveau classe au lieu d'une propriété de niveau instance, vous pouvez utiliser un objet compagnon :

class Apple {
    companion object {
        val Apple_SIZE_KEY: String = "Apple_SIZE_KEY"
    }
}

fun useAppleKey() {
    println(Apple.APPLE_SIZE_KEY)
}

Ce que vous avez actuellement est une propriété d'instance, que vous pouvez utiliser comme ceci:

fun useInstanceProperty() {
    val Apple = Apple()
    println(Apple.APPLE_SIZE_KEY)
}
5
zsmb13