2011-05-25 14 views
7

¿Qué solución se debe preferir generalmente, teniendo en cuenta que el cambio es compatible con la fuente?val u objeto para el objeto singleton final e inmutable

Este

object Foo { 
    val Bar = new Baz(42, "The answer", true) 
} 

o el presente?

object Foo { 
    object Bar extends Baz(42, "The answer", true) 
} 
+0

Diría que primero es mejor si quiere modularizar su API de manera diferente en el futuro sin demasiadas modificaciones ... pero dado que el cambio es compatible con la fuente, puede conservar la segunda hasta que sea necesario. –

+0

Posible duplicado de [val y objeto dentro de una clase scala?] (Http://stackoverflow.com/questions/3448691/val-and-object-inside-a-scala-class) – Bergi

Respuesta

8

La diferencia funcional entre las dos construcciones es que object Bar solo se crea cuando es necesario, mientras que val Bar se crea tan pronto como se utiliza object Foo. Como cuestión práctica, esto significa que debe usar el objeto (o lazy val) si el lado derecho es caro y no siempre será necesario. De lo contrario, val es probablemente más simple.

Además, tenga en cuenta que si la clase Baz es final, usted no será capaz de utilizar el estilo object ya que no puede extenderse Baz (aunque todavía se puede utilizar lazy val si desea aplazar la creación hasta que sea necesario) .

+0

Lo siento, no era lo suficientemente claro . Quise decir con 'final' que la variable' Bar' no será reasignada. ¿No es el bytecode para 'object' ligeramente más simple que el código para' lazy val'? – soc

+0

@soc - Sí, 'lazy val' es un código más complejo (y seguro para el hilo). Y edité mi respuesta para aclarar lo que quería decir con respecto a "final". –

+0

¿No debería 'object' ser seguro para subprocesos también? – soc

2

Me dicen que el primero, ya que en la segunda, se está creando una nueva clase, pero no aportan ninguna información (sin primordial de los métodos, los valores o los nuevos).

Cuestiones relacionadas