Pregunta Explicación de objetos singleton en Scala


Obtengo la codificación porque 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 semifallo. De los cuales no puedes crear una instancia. Entonces ... mi pregunta es principalmente el propósito de un objeto singleton en esta instancia particular.

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

Estoy leyendo el Programación en Scala el libro y el Capítulo 4 solo hablaban de 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 haber leído nada en el Programación en Scala sitio web que Java era un prerrequisito para leer este libro ...


33
2018-06-30 21:37


origen


Respuestas:


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 objetos complementarios se exponen a través de "reenviadores estáticos" por el bien de la interoperabilidad de Java)

Sin embargo, los singleton van mucho más allá de esto.

  • Un singleton puede heredar métodos de otras clases / características, lo que no se puede hacer con estática.
  • Un singleton se puede pasar como un parámetro (quizás a través de una interfaz heredada)
  • Un singleton puede existir dentro del alcance de una clase o método circundante, así como Java puede tener clases internas
  • También vale la pena señalar 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.

Lo que ayuda a Scala a ser un lenguaje mucho más orientado a objetos que Java (los 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.


53
2018-06-30 21:57



En muchos casos, necesitamos un singleton para representar un objeto único en nuestro sistema de software. Piensa en el sistema solar. Podemos tener las siguientes clases

class Planet
object Earth extends Planet
object Sun extends Planet

objeto es una forma simple de crear singleton, por supuesto se usa generalmente para crear un método de nivel de clase, como método estático en java


14
2017-07-01 02:39



Adicional a las respuestas dadas (y yendo en la misma dirección general que jilen), objects juegan un papel importante en Scala implicit mecanismo, p. permitiendo un comportamiento similar a un tipo de clase (como lo conoce 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 un fold-Función. que "colapsa" una cantidad de Ts juntos, siempre que haya un Monoid (cosas que tienen un elemento neutro, y pueden "agregarse" de alguna manera juntas) para T. Para usar esto, solo necesitamos 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 esto funciona:

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

Asi que objects son muy útiles por derecho propio.

¡Pero espera, hay más! Los objetos acompañantes también pueden servir como un tipo de "configuración predeterminada" al extender su clase acompañante:

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

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

Entonces, por un lado, tienes el rasgo Config, que el usuario puede implementar como quiera, pero por otro lado hay un objeto listo Config cuando quieras ir con la configuración predeterminada.


4
2017-07-01 07:10



Sí, es básicamente una forma de proporcionar métodos de clase cuando se usa como un objeto compañero.


2
2018-06-30 21:51