Связанный с внедрением, внедренным с функциями установки - PullRequest
1 голос
/ 18 июня 2010

Я пытаюсь использовать Scala как часть существующего Java-приложения, и теперь я сталкиваюсь с проблемой с зависимостями, внедряемыми с помощью метода сеттера (в этой части кода нет структур DI). Как это обрабатывается в стиле Scala?

В Scala val и var требуют инициализации при объявлении, но я не могу этого сделать, поскольку сеттеры Java внедряют объекты, которые реализуют определенный интерфейс и интерфейсы, абстрактны и не могут быть созданы.

class ScalaLogic {
  var service  // How to initialize?

  def setService (srv: OutputService) = {
  service = srv
}

Есть ли способ инициализировать var service, чтобы впоследствии я мог назначить ему зависимость? Он должен иметь лексическую область видимости для всего класса.

Ответы [ 3 ]

5 голосов
/ 18 июня 2010

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

class ScalaLogic {
  var service: OutputService = _

  def setService (srv: OutputService) = {
    service = srv
  }
}

Хорошая вещь в подчеркивании (в отличие от простого использования null) заключается в том, что он работает как с примитивами, так и с объектами, поэтому параметризованные классы работают так:

class ScalaLogic[T] {
  var service: T = _

  def setService (srv: T) = {
    service = srv
  }
}
3 голосов
/ 18 июня 2010

Одним из многих значений подчеркивания является пометка переменной как неинициализированной. Поэтому, если вы хотите неинициализированное поле, инициализируйте его с помощью _.

Чтобы иметь методы получения и установки для поля, аннотируйте его с помощью @BeanProperty. Компилятор сгенерирует для вас геттер и сеттер в стиле Java.

import reflect.BeanProperty

class ScalaLogic {
  @BeanProperty 
  var service: OutputService = _
}

Кстати, каноническая ссылка на инъекцию зависимостей в Scala - это резюме Джонаса Бонера Однако эта статья не охватывает инъекцию на основе сеттера, если я правильно помню.

2 голосов
/ 18 июня 2010

Попробуйте использовать класс Option.Это моральный эквивалент использования null в Java.Объявите службу следующим образом:

var service: Option[MyInterface] = None

и используйте

service.get()

или сопоставление с шаблоном

service match {
    case None => ...
    case Some[MyInterface] => ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...