Domknięcie na otaczającym scopie

0

Mam problem, jeśli mamy coś takiego:

class Dupa(i: Int) extends Actor 
class A {
  def createActor = context.actorOf(Props(new Dupa(3)))
}

I w dokumentacji akki jest takie zdanie, że jest takie coś odradzane (definicja new Dupa(3) w środku) bo mogą nastąpić problemy z enkapsulacją, i jest polecane coś takiego:

class Dupa(i: Int) extends Actor 
object Dupa {
  def props(i: Int) = Props(new Dupa(i))
}
class A {
  def createActor = context.actorOf(Dupa.props(3))
}

Ogólnie pisze że w pierwszym przypadku rzekomo jest jakieś domknięcie. Ja tego nie widzę, zawsze myślałem że domknięcie to jakbym zrobił coś takiego

class A {
  def dupa = new Dupa(3)
  def createActor = context.actorOf(Props(dupa))
}

Link o czym mówię:
http://doc.akka.io/docs/akka/2.4.0/scala/actors.html#Dangerous_Variants

Ogólnie chodzi mi, czy to co przedstawione na 1 wklejce to czy to jest domknięcie i dlaczego?

0

Props.apply ma argument przekazywany przez nazwę (call-by-name):
https://github.com/akka/akka/blob/v2.3.1/akka-actor/src/main/scala/akka/actor/Props.scala#L84
Takie przekazywanie argumentu realizuje się przez stworzenie domknięcia (kompilator Scali stworzy klasę anonimową/ lambdę).

W pierwszym przypadku domknięcie będzie miało wskaźnik do instancji klasy A (bo w niej się znajduje), w drugim nie (bo już jest wyciągnięte poza klasę A).

0

Dzięki mr Wibowit.

A czy takie coś będzie bezpieczne?

class Repository
class Child(i: Int, repository: Repository) extends Actor 
object Child {
  def props(i: Int, repository: Repository) = Props(new Child(i, repository))
}
class Parent(repository: Repository) extends Actor{
  def createActor = context.actorOf(Child.props(3, repository))
}
class Parent2 extends Actor{
  val repository = new Repository
  def createActor = context.actorOf(Child.props(3, repository))
}
0

Powinno być OK.

1 użytkowników online, w tym zalogowanych: 0, gości: 1