Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can use <code>lazy val</code>:</p> <pre><code>scala&gt; :paste // Entering paste mode (ctrl-D to finish) case class Person (val name: String, val surname: String) case class Family (val nameFamily: String, val members: Set[Person]) lazy val f1 = new Family ("Red", Set(p1, p2)) lazy val p1 = new Person ("John", "Smith") lazy val p2 = new Person ("Luis", "Smith") // Exiting paste mode, now interpreting. defined class Person defined class Family f1: Family = &lt;lazy&gt; p1: Person = &lt;lazy&gt; p2: Person = &lt;lazy&gt; scala&gt; f1 res0: Family = Family(Red,Set(Person(John,Smith), Person(Luis,Smith))) </code></pre> <p>If you want to set some value somewhere after creation of object only once you should use Promise from scala 2.10:</p> <pre><code>import concurrent.{Promise, Future} case class Person (val name: String, val surname: String) class Family (val nameFamily: String) { private val membersPromice = Promise[Set[Person]] def setMembers(m: Set[Person]) { membersPromice.success(m) } val membersFuture = membersPromice.future def members = membersFuture.value.map(_.get) override def toString() = "Family(" + nameFamily + ", " + members.getOrElse("&lt;future&gt;") + ")" } </code></pre> <p>Usage:</p> <pre><code>scala&gt; val f = new Family("red") f: Family = Family(red, &lt;future&gt;) scala&gt; val (p1, p2) = (Person("John", "Smith"), Person("Luis", "Smith")) p1: Person = Person(John,Smith) p2: Person = Person(Luis,Smith) scala&gt; f.setMembers(Set(p1, p2)) scala&gt; f res1: Family = Family(red, Set(Person(John,Smith), Person(Luis,Smith))) scala&gt; f.setMembers(Set(p1, p2)) java.lang.IllegalStateException: Promise already completed. </code></pre> <p>You can use <a href="https://web.archive.org/web/20120513085210/http://www.tikalk.com/java/blog/type-safe-builder-scala-using-type-constraints" rel="nofollow noreferrer">type-safe builder pattern</a>:</p> <pre><code>case class Person (val name: String, val surname: String) case class Family (val nameFamily: String, val members: Set[Person]) sealed abstract class TBool class TTrue extends TBool class TFalse extends TBool class FamilyBuilder[WithName &lt;: TBool, WithMembers &lt;: TBool](val nameFamily: Option[String], val members: Option[Set[Person]]) { def withName(nameFamily: String)(implicit i: WithName =:= TFalse) = new FamilyBuilder[TTrue, WithMembers](Some(nameFamily), members) def withMembers(members: Set[Person])(implicit i: WithMembers =:= TFalse) = new FamilyBuilder[WithName, TTrue](nameFamily, Some(members)) def create()(implicit i1: WithName =:= TTrue, i2: WithMembers =:= TTrue) = Family(nameFamily.get, members.get) } object FamilyBuilder { def apply() = new FamilyBuilder[TFalse, TFalse](None, None) } </code></pre> <p>Usage:</p> <pre><code>scala&gt; FamilyBuilder() withName "Red" withMembers Set(p1, p2) create() res1: Family = Family(Red,Set(Person(John,Smith), Person(Luis,Smith))) scala&gt; FamilyBuilder() withMembers Set(p1, p2) withName "Red" create() res2: Family = Family(Red,Set(Person(John,Smith), Person(Luis,Smith))) scala&gt; FamilyBuilder() withName "Red" create() &lt;console&gt;:1: error: Cannot prove that TFalse =:= TTrue. FamilyBuilder() withName "Red" create() ^ </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload