185 votes

Pourquoi utilisons-nous "objet compagnon" comme une sorte de remplacement pour les champs statiques Java dans Kotlin?

Quel est le sens de "compagnon de l'objet"? Jusqu'à présent, je l'ai utilisé pour remplacer Java static quand j'en ai besoin.

Je suis confondu avec:

  • Pourquoi est-il appelé "compagnon"?
  • Ça veut dire que pour créer plusieurs statique de propriétés, j'ai pour le groupe ensemble à l'intérieur d' companion object bloc?
  • Pour créer instantanément une instance du singleton dont l'étendue correspond à une classe, j'écris souvent

:

companion object {
    val singleton by lazy { ... }
}

ce qui semble être un unidiomatic façon de faire. Quelle est la meilleure façon de faire?

129voto

hotkey Points 119
  • Quel est le sens de "compagnon de l'objet"? Pourquoi est-il appelé "compagnon"?

    Tout d'abord, Kotlin ne pas utiliser le Java concept d' static membres parce que Kotlin a son propre concept de objects pour décrire les propriétés et les fonctions liées à singleton état, et Java static partie d'une classe peuvent être élégamment exprimée en termes de singleton: c'est un objet singleton qui peut être appelée par la classe du nom. D'où le nom: c'est un objet qui vient avec une classe.

    Son nom utilisé pour être class object et default object, mais ensuite il fut renommé companion object ce qui est plus clair et est également compatible avec la Scala compagnon objets.

    En dehors de nommage, il est plus puissant que Java static membres: il peut étendre des classes et des interfaces, et vous pouvez référencer et de les passer, comme les autres objets.

  • Ça veut dire que pour créer de multiples propriétés statiques, je dois le groupe ensemble à l'intérieur d' companion object bloc?

    Oui, c'est le idiomatiques. Ou vous pouvez même groupe dans la non-compagnon objets par leur sens:

    class MyClass {
        object IO {
            fun makeSomethingWithIO() { /* ... */ }
        }
    
        object Factory {
            fun createSomething() { /* ... */ }
        }
    }
    
  • Pour créer instantanément une instance du singleton dont l'étendue correspond à une classe, j'écris souvent /*...*/ , ce qui semble être un unidiomatic façon de faire. Quelle est la meilleure façon de faire?

    Cela dépend de ce que vous avez besoin dans chaque cas particulier. Votre code convient pour le stockage de l'état lié à une classe qui est initialisé lors de la première de l'appel à elle.

    Si vous n'avez pas besoin d'être reliée avec une classe, il suffit d'utiliser l'objet de la déclaration:

    object Foo {
        val something by lazy { ... }
    }
    

    Vous pouvez également supprimer lazy { ... } délégation pour rendre la propriété initialiser sur premier de la classe de l'utilisation, tout comme Java initialiseurs statiques

    Vous pouvez également trouver des moyens utiles de l' initialisation de singleton état.

19voto

D3xter Points 2053

Pourquoi est-il appelé "compagnon"?

Cet objet est un compagnon des instances. Autant que je me souvienne, il y avait une longue discussion ici: à venir-changement de classe-objets-revue

Ça veut dire que pour créer de multiples propriétés statiques, je dois le groupe ensemble à l'intérieur de compagnon objet de bloc?

Oui. Tous les "statiques", propriété/méthode doit être placé à l'intérieur de ce compagnon.

Pour créer instantanément une instance du singleton dont l'étendue correspond à une classe, j'écris souvent

Vous n'avez pas à créer l'instance du singleton instantanément. Il est créé lors de l'accès singleton , pour la première fois.

ce qui semble être un unidiomatic façon de faire. Quelle est la meilleure façon de faire?

Plutôt aller avec object Singleton { } pour définir un singleton de classe. Voir: Objet De Déclarations Vous n'avez pas à créer une instance de Singleton, il suffit d'utiliser ça comme ça Singleton.doWork()

Il suffit de garder à l'esprit que Kotlin propose d'autres choses à organiser votre code. Il existe maintenant des alternatives à de simples fonctions statiques par exemple, vous pouvez utiliser le Haut-Niveau-Fonctions à la place.

8voto

Lyn Points 101

Pourquoi est-il appelé "compagnon"?

Une déclaration d'objet à l'intérieur d'une classe peut être marqué avec le compagnon de mots clés:

class MyClass {
    companion object Factory {
        fun create(): MyClass = MyClass()
    }
}

Les membres de la compagne de l'objet peut être appelé en utilisant simplement le nom de la classe à la qualification:

val instance = MyClass.create()

Si vous n'utilisez que de l'objet "sans " compagnon", vous devez faire comme ceci:

val instance = MyClass.Factory.create()

Dans ma compréhension, "compagnon" signifie que cet objet est compagnon avec le outter classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X