Распознавание вызовов сеттера

У меня есть приложение, в котором некоторые значения переменных должны публиковаться в очереди сообщений при изменении. То есть, если вызывается сеттер var, я хочу, чтобы это как-то заметили, и после установки нового значения я хочу, чтобы оно было опубликовано в MQ.

Некоторое время назад я сделал что-то подобное с Perl/Moose, установив after-modifier (выполнив публикацию) для методов с определенным атрибутом метода. Это решение было очень элегантным и не требовало никаких синтаксических издержек, кроме дополнительного атрибута метода.

Что было бы хорошим решением с использованием возможностей Scala (2.10) без использования неуклюжих шаблонов объектно-ориентированного программирования?

Обновление: я хотел бы добиться того, чтобы код выглядел примерно так:

@Publishable var someProperty = 42

or

domainSpecificLanguageMagic someProperty = 42

Одна из проблем заключается в том, что эти свойства могут быть заданы рефлексивно, поэтому метод установки с другим именем (вероятно?) не вариант.


person tobi    schedule 12.11.2013    source источник


Ответы (2)


Я предполагаю, что путь - это виртуализированная Scala: у нее есть некоторые встроенные примитивы, которые позволяют изменять семантику языка, включая назначение. Это не стандартная scala , но вполне официально поддерживается, и новый релиз обычно выходит не слишком поздно после обычного (через несколько недель). (я спутал его с другим фреймворком scala -- LMS, AFAIS не поддерживается неплохим банкоматом, но все же должен решить вашу проблема)

person om-nom-nom    schedule 12.11.2013
comment
По иронии судьбы, ответ на вопрос ОП (без неуклюжих шаблонов OO) — это … переопределение методов :-D - person Jörg W Mittag; 12.11.2013

Вы можете сделать свойство приватным (и дать ему альтернативное имя) и определить его методы доступа и мутатора:

class C1(...) {
  private var iProp: Int = 0

  def prop: Int = iProp

  /* Put additional logic associated with mutation here: */
  def prop_=(newProp: Int): Unit = iProp = newProp
}
person Randall Schulz    schedule 12.11.2013