Удалите дублирование с помощью AbstractBehavior.createReceive

#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 может быть легко заменено на a createBehavior() и вернуть a Behavior , устраняя необходимость в получении вообще.

4. Интересно, что аналог в scaladsl (я в основном использую только функциональный стиль и scaladsl) есть def onMessage(msg: T): Behavior[T] . Единственная правдоподобная вещь, о которой я могу думать, это то, что Receive<T> (в соответствии с классическим API) является оригинальным типизированным API OO, и он сохраняется для обратной совместимости, а функциональный API ввел идею Behavior .