Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Instantiating immutable paired objects

Is it possible to create a class with an immutable reference to a partner object, or does it have to be a var that I assign after creation?

e.g.

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

or similarly how could I instantiate the following pair?

class Chicken (e: Egg) {    val offspring = e }  class Egg (c: Chicken) {   val mother = c } 
like image 981
Luigi Plinge Avatar asked Sep 21 '11 23:09

Luigi Plinge


2 Answers

Here is a complete solution to the Chicken/Egg problem:

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) 

Note that you have to provide explicit types to the chicken and egg variables.

And for 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") 
like image 169
Eric Avatar answered Oct 08 '22 23:10

Eric


If your problem is circular references, you could use the solution posted in this SO question:

scala: circular reference while creating object?

This solves the chicken/egg problem.

like image 45
JaimeJorge Avatar answered Oct 08 '22 23:10

JaimeJorge