Как сделать апплет Scala, у которого класс Applet является синглтоном? - PullRequest
2 голосов
/ 27 марта 2010

Я не знаю, существует ли решение, но это было бы очень желательно.

Я делаю апплет Scala и хочу, чтобы основной класс апплета был одноэлементным, чтобы к нему можно было получить доступ в другом месте апплета, например:

object App extends Applet {
  def init {
    // do init here
  }
}

Вместо этого я должен сделать класс App обычным инстанцируемым классом, в противном случае он жалуется, потому что конструктор является закрытым. Итак, уродливый хак у меня должен пойти:

object A {
  var pp: App = null
}

class App extends Applet {
  A.pp = this
  def init {
    // do init here
  }
}

Я действительно ненавижу это, и это одна из причин, по которой я не люблю делать апплеты в Scala прямо сейчас.

Есть ли лучшее решение? Было бы неплохо ...

edit - я нашел довольно приличное решение для взлома с использованием неявного преобразования. Объявите ваш класс Applet как обычный класс, а затем добавьте:

class Appable {}

object App extends Appable {
implicit def appable2App(a:Appable) = inst
  var inst: App = null
}

Затем просто установите переменную экземпляра при создании апплета, и вы сможете получить доступ ко всему, как к одиночному.

1 Ответ

3 голосов
/ 29 марта 2010

То, что вы просите, противоречит модели исполнения апплета. В частности, нет никаких гарантий, что в одной JVM не будет запущено несколько копий апплета. По умолчанию запускается каждый апплет в той же JVM (включая несколько копий одного и того же апплета, если это необходимо). Смотрите, например Учебник Sun .

Именно поэтому апплеты указываются так, как они есть, а не методом static public void. Разве остальная часть вашего кода не может принять апплет в качестве параметра?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...