2011-06-30 14 views
31

Obtengo la codificación en la que básicamente se proporciona un "objeto SomeClass" y una "clase SomeClass" y la clase complementaria es la declaración de clase y el objeto es un singleton. De los cuales no puedes crear una instancia. Entonces ... mi pregunta es principalmente el propósito de un objeto singleton en esta instancia particular.Explicación de objetos singleton en Scala

¿Básicamente es solo una manera de proporcionar métodos de clase en Scala? Me gusta + métodos basados ​​en Objective-C?

Estoy leyendo el libro Programming in Scala y el Capítulo 4 acaba de hablar sobre objetos singleton, pero no entra en muchos detalles sobre por qué esto es importante.

Me doy cuenta de que puedo estar adelantado aquí y que podría explicarse con mayor detalle más adelante. Si es así, házmelo saber. Este libro es razonablemente bueno hasta ahora, pero tiene mucho "en Java, haz esto", pero tengo tan poca experiencia en Java que echo de menos un poco de los puntos que temo. No quiero que esta sea una de esas situaciones.

no recuerdo leer en cualquier parte del Programming in Scala website que Java es un requisito previo para la lectura de este libro ...

+0

De hecho, los autores afirman que Java no es un requisito previo, pero también comentan que es útil para comparar. En la introducción de la segunda edición [Programación en Scala] (http://www.artima.com/shop/programming_in_scala_2ed): "Por otro lado, no se requiere un conocimiento específico de los lenguajes de programación. Aunque la mayoría de la gente usa Scala en la plataforma Java, este libro no supone que usted conozca nada sobre Java. Sin embargo, esperamos que muchos lectores estén familiarizados con Java, por lo que a veces comparamos Scala con Java para ayudar a dichos lectores a entender las diferencias ". Odersky y otros (2008 [2010]: xlv). –

Respuesta

50

Sí, los singletons complementarios proporcionan un equivalente a los métodos estáticos de Java (y C++, C# s, etc.).

(de hecho, los métodos de objeto acompañante están expuestos a través de los transitarios "estáticos" en aras de la interoperabilidad de Java)

Sin embargo, únicos recorrer un camino justo más allá de esto.

  • Un singleton puede heredar métodos de otras clases/rasgos, lo que no se puede hacer con estática.
  • A singleton se puede pasar como un parámetro (tal vez a través de una interfaz heredado)
  • A singleton puede existir dentro del alcance de una clase o método circundante, tal como Java puede tener clases internas
  • Es también digno de mención que un singleton no tiene que ser un acompañante, es perfectamente válido para definir un singleton sin definir también una clase complementaria.

que ayuda a hacer Scala un lenguaje orientado a objetos mucho más que Java (métodos estáticos no pertenecen a un objeto ). Irónico, dado que se discute en gran medida en términos de sus credenciales funcionales.

+0

Estaba publicando un enlace a [su respuesta] (http://stackoverflow.com/questions/4112088/why-are-singleton-objects-more-object-orientated/4112864#4112864) en otro hilo cuando apareció . Bonitos poderes psíquicos. –

+0

¡Ya sabes, simplemente me olvidé de eso! –

+0

Gracias, respuesta increíble. Lo aprecio. – gks

2

sí, es básicamente una forma de proporcionar class methods cuando se utiliza como un objeto acompañante.

13

En muchos casos, necesitamos un singleton para representar un objeto único en nuestro sistema de software. Piensa en el sistema solar. Es posible que hayamos siguientes clases

class Planet 
object Earth extends Planet 
object Sun extends Planet 

objeto es una manera simple de crear Singleton, por supuesto que se utiliza normalmente para crear método de nivel de clase, como método estático en Java

+1

+1 para aludir a la equivalencia de las enumeraciones de Java a través de su opción de ejemplo ... –

4

adicional a las respuestas dadas (y va en la misma dirección general que jilen), object s desempeñan un papel importante en el mecanismo implicit de Scala, por ejemplopermitiendo que el tipo de clase similar a la conducta (como se conoce a partir de Haskell):

trait Monoid[T] { 
    def zero:T 
    def sum(t1:T, t2:T):T 
} 

def fold[T](ts:T*)(implicit m:Monoid[T]) = ts.foldLeft(m.zero)(m.sum(_,_)) 

Ahora tenemos una fold -Función. que "colapsa" un número de T s juntos, siempre que haya un Monoid apropiado (cosas que tienen un elemento neutral, y pueden "agregarse" de alguna manera juntas) para T. Con el fin de utilizar esto, sólo tenemos que uno instancia de un Monoid para algún tipo T, el trabajo perfecto para un object:

implicit object StringMonoid extends Monoid[String] { 
    def zero = "" 
    def sum(s1:String, s2:String) = s1 + s2 
} 

Ahora bien, esto funciona:

println(fold("a","bc","def")) //--> abcdef 

Así object s son muy útil por derecho propio.

¡Pero espera, hay más! objetos Companion también pueden servir como una especie de "configuración por defecto" al extender su clase compañera:

trait Config { 
    def databaseName:String 
    def userName:String 
    def password:String 
} 

object Config extends Config { 
    def databaseName = "testDB" 
    def userName = "scott" 
    def password = "tiger" 
} 

Así, por un lado tiene el rasgo Config, que puede ser implementado por el usuario sin embargo ella quiere, pero por otro lado, hay un objeto preparado Config cuando desea ir con la configuración predeterminada.

+1

No entiendo esta respuesta – Valentin

+3

@Valentin Vasilyev Lamento escuchar esto, pero no puedo explicar todos los detalles aquí, así que me limité a algunos casos de uso. Existen excelentes tutoriales que tratan este tema en detalle, y especialmente el mecanismo implícito es una herramienta muy útil y versátil, pero necesita mucha explicación para los diferentes casos. – Landei

Cuestiones relacionadas