¿Por qué usamos "object complementario" como un tipo de reemploop para los campos estáticos de Java en Kotlin?

¿Cuál es el significado pretendido de "object acompañante"? Hasta ahora lo he estado usando solo para replace la static de Java cuando lo necesito.

Estoy confundido con:

  • ¿Por qué se llama "compañero"?
  • ¿Significa que para crear múltiples properties estáticas , tengo que agruparlas dentro del bloque de companion object ?
  • Para crear instantáneamente una instancia única que tenga un scope para una class, a menudo escribo

:

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

que parece una forma unidiomática de hacerlo. ¿Cuál es la mejor manera?

    • ¿Cuál es el significado pretendido de "object acompañante"? ¿Por qué se llama "compañero"?

      Primero, Kotlin no usa el concepto Java de miembros static porque Kotlin tiene su propio concepto de object para describir properties y funciones conectadas con el estado singleton, y static parte static Java de una class puede expressse elegantemente en términos de singleton: es una object singleton que puede ser llamado por el nombre de la class. De ahí la denominación: es un object que viene con una class.

      Su nombre solía ser class object y class object default object , pero luego se renombró a companion object que es más claro y también es consistente con los objects complementarios de Scala .

      Además de nombrar, es más poderoso que static miembros static Java: puede extender classs e interfaces, y puede hacer reference y pasarlo como otros objects.

    • ¿Significa que para crear múltiples properties estáticas, tengo que agruparlas dentro del bloque de companion object ?

      Sí, esa es la forma idiomática. O incluso puedes agruparlos en objects no acompañantes por su significado:

       class MyClass { object IO { fun makeSomethingWithIO() { /* ... */ } } object Factory { fun createSomething() { /* ... */ } } } 
    • Para crear instantáneamente una instancia singleton que tenga un scope para una class, a menudo escribo /*...*/ que parece una forma unidiomática de hacerlo. ¿Cuál es la mejor manera?

      Depende de lo que necesita en cada caso particular. Su código se adapta bien para almacenar estados vinculados a una class que se inicializa en la primera llamada a ella.

      Si no necesita que esté conectado con una class, solo use la statement de object:

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

      También puede eliminar la lazy { ... } delegación lazy { ... } para hacer que la propiedad se inicie en el uso de primera class, al igual que los inicializadores estáticos de Java

      También puede encontrar forms útiles de inicializar el estado singleton .

    ¿Por qué se llama "compañero"?

    Este object es un acompañante de las instancias. IIRC hubo una larga discusión aquí: next-change-class-objects-rethought

    ¿Significa que para crear múltiples properties estáticas, tengo que agruparlas dentro del bloque de objects complementarios?

    Sí. Cada propiedad / método "estático" debe colocarse dentro de este compañero.

    Para crear instantáneamente una instancia única que tenga un scope para una class, a menudo escribo

    No creas la instancia singleton al instante. Se crea al acceder a singleton por primera vez.

    que parece una forma unidiomática de hacerlo. ¿Cuál es la mejor manera?

    En lugar de ir con el object Singleton { } para definir una class singleton. Ver: Declaraciones de objects No es necesario crear una instancia de Singleton , simplemente utilícela como Singleton.doWork()

    Solo tenga en count que Kotlin ofrece otras cosas para organizar su código. Ahora hay alternativas a las funciones estáticas simples, por ejemplo, podría usar Funciones de nivel superior en su lugar.