¿Existe algún caso en el que se necesite un objeto complementario (singleton) para una clase? ¿Por qué querría crear una clase, digamos Foo
y también crear un objeto complementario para ella?
oop
scala
companion-object
Rahul
fuente
fuente
Respuestas:
El objeto compañero básicamente proporciona un lugar donde se pueden colocar métodos "similares a estáticos". Además, un objeto complementario, o módulo complementario, tiene acceso completo a los miembros de la clase, incluidos los privados.
Los objetos complementarios son excelentes para encapsular cosas como métodos de fábrica. En lugar de tener que tener, por ejemplo,
Foo
y enFooFactory
todas partes, puede hacer que una clase con un objeto compañero asuma las responsabilidades de la fábrica.fuente
Los objetos complementarios son útiles para almacenar estados y métodos que son comunes a todas las instancias de una clase, pero no utilizan métodos o campos estáticos . Utilizan métodos virtuales regulares que pueden anularse mediante herencia. Scala realmente no tiene nada estático. Hay muchas formas de usar esto, pero aquí hay un ejemplo simple.
Que produce esta salida:
fuente
... y es un buen lugar para almacenar métodos de fábrica estáticos (no ese DP) para clases acompañadas. Si nombra esos métodos de fábrica sobrecargados que se aplican (/ ... /), podrá crear / inicializar su clase
sin 'nuevo' (no es tan importante)
con diferentes conjuntos de parámetros posibles (compare con lo que Bloch escribe en Effective Java sobre constructor telescópico)
con la capacidad de decidir qué clase derivada desea crear en lugar de la abstracta (acompañada)
Código de ejemplo:
No llamaría AbstractXxxxx al objeto / clase base porque no se ve mal: como crear algo abstracto. Dale a esos nombres un significado real. Considere usar clases de caso inmutables, sin método, y selle la clase base abstracta.
fuente
RealThing
y laAlternativeThing
clase debe tener unprivate
constructor para obligar al usuario a usar laAbstractClass
fábrica has.class AlternativeThing private(i: Int) extends AbstractClass
Además de las cosas que dijo Saem en su respuesta , el compilador de Scala también busca conversiones implícitas de tipos en los objetos complementarios correspondientes (de origen o de destino), por lo que no es necesario importar las conversiones.
Sobre la razón de los objetos singleton en la programación general en Scala dice:
fuente
Siempre veo los objetos complementarios como un puente para escribir código funcional y orientado a objetos en Scala. Muchas veces solo necesitamos funciones puras que toman alguna entrada y brindan un resultado de procesamiento. Poner esas funciones relevantes en el objeto complementario facilita la búsqueda y el uso, tanto para mí como para alguien que se basa en mi código.
Además, es una característica proporcionada por el lenguaje para escribir el patrón singleton sin hacer nada. Esto es especialmente útil cuando necesita un singleton para encapsular un delegador durante la vida de JVM. Por ejemplo, escribir una biblioteca de cliente HTTP simple en Scala donde puede encapsular un delegador basado en la implementación de Java subyacente y dejar que los consumidores de su API vivan en un mundo puro.
fuente
Si define la clase y el objeto en el mismo archivo con el mismo nombre, se conocen como clase y objeto complementarios. Scala no tiene static como palabra clave JAVA, puede tomar como reemplazo de static con clase complementaria y objeto en Scala.
Para obtener más información detallada, consulte la clase del artículo y la palabra clave del objeto en la programación de Scala.
fuente
Al principio, proporciona una clara separación de los métodos de métodos estáticos y no estáticos. También proporciona una forma sencilla de crear clases singleton.
También puede heredar métodos de otras clases y / o rasgos, lo que no se puede hacer con métodos estáticos de Java y se puede pasar como parámetro.
fuente