#java #akka #akka-typed
Вопрос:
при реализации актера с типом Akka путем расширения createReceive мы увидим что-то вроде этого:
@Override
public Receive<Command> createReceive()
{
return newReceiveBuilder()
.onMessage(SomeCommand.class, s -> something())
.build();
}
..с something()
возвращением a Behavior
, например:
public Behavior<Command> something()
{
return Behaviors.receive(Command.class)
.onMessage(SomeCommand.class, m -> something())
.build();
}
Но теперь мы можем видеть это createReceive()
и something()
быть в значительной степени дубликатами. Другими словами, всякий раз, когда я возвращаюсь в «начальное» состояние, я получаю это дублирование кода. Итак, вопрос в том,:
Могу ли я как-то реализовать createReceive()
этот метод, повторно используя something()
его? Например, возможно ли что-то подобное…
@Override
public Receive<Command> createReceive()
{
return Behaviors.behave( this::something);
}
(Конечно, Behaviors.behave
такого не существует, вопрос в том, существует ли что-то подобное, «преобразующее» поведение в получение?)
Комментарии:
1.
Receive
это просто нечто особенноеBehavior
(что поднимает вопрос о том, что делает его особенным помимо того, что он был построен с использованиемReceiveBuilder
), поэтому вы могли бы изменить его иsomething()
просто бытьreturn createReceive()
.2. Поскольку
Receive
/Behavior
на самом деле являются просто замаскированными функциями, я также не понимаю, почему вы не могли сохранитьReceive
встроенное поле.3. @LeviRamsey Спасибо, это хорошее предложение, я только всегда пробовал по-другому, не понимая, что
Receive
а на самом деле есть аBehavior
. Все еще не уверен, зачем это на самом деле требуется ,createReceive
может быть легко заменено на acreateBehavior()
и вернуть aBehavior
, устраняя необходимость в получении вообще.4. Интересно, что аналог в scaladsl (я в основном использую только функциональный стиль и scaladsl) есть
def onMessage(msg: T): Behavior[T]
. Единственная правдоподобная вещь, о которой я могу думать, это то, чтоReceive<T>
(в соответствии с классическим API) является оригинальным типизированным API OO, и он сохраняется для обратной совместимости, а функциональный API ввел идеюBehavior
.