2011-09-21 16 views
25

¿Es posible crear una clase con una referencia inmutable a un objeto asociado, o tiene que ser un var que asigno después de la creación?Creación de objetos emparejados inmutables

p. Ej.

class PairedObject (p: PairedObject, id: String) { 
    val partner: PairedObject = p // but I need ref to this object to create p! 
} 

o similar, ¿cómo podría crear una instancia del siguiente par?

class Chicken (e: Egg) { 
    val offspring = e 
} 

class Egg (c: Chicken) { 
    val mother = c 
} 

Respuesta

25

Aquí es una solución completa al problema de pollo/huevo:

class Chicken (e: =>Egg) { 
    lazy val offspring = e 
} 

class Egg (c: =>Chicken) { 
    lazy val mother = c 
} 

lazy val chicken: Chicken = new Chicken(egg) 
lazy val egg: Egg   = new Egg(chicken) 

Tenga en cuenta que usted tiene que proporcionar tipos explícitas a las variables chicken y egg.

Y para PairedObject:

class PairedObject (p: => PairedObject, val id: String) { 
    lazy val partner: PairedObject = p 
} 

lazy val p1: PairedObject = new PairedObject(p2, "P1") 
lazy val p2: PairedObject = new PairedObject(p1, "P2") 
+0

¡Ingenioso! Probado ... funciona –

+0

Agregué la solución para PairedObject también. También encontré que vals para 'pollo' y 'huevo' no necesitan ser flojos. Estrictamente no es necesario incluir tipos para ambos, como se puede inferir. –

+9

Esta solución funcionará si se ingresa en el nivel superior de una definición de 'clase' u 'objeto', pero se obtiene un error de referencia directa ilegal si' chicken' y 'egg' son variables locales (por ejemplo, dentro de una función). Una solución que funciona en cualquier ámbito es: 'perezoso val (huevo: huevo, pollo: pollo) = ...', que puede ser autorreferencial. –

4

Si su problema es referencias circulares, se puede utilizar la solución publicado en esta cuestión de forma:

scala: circular reference while creating object?

Esto resuelve el problema de la gallina/huevo.

+0

funciona bien si sólo tengo un par de 'caso object's: acaba de hacer el val' lazy'. –

Cuestiones relacionadas