У меня такая ситуация:
interface MessageListener
{
void onMessageReceipt(Message message);
}
class MessageReceiver
{
MessageListener listener;
public MessageReceiver(MessageListener listener, other arguments...)
{
this.listener = listener;
}
loop()
{
Message message = nextMessage();
listener.onMessageReceipt(message);
}
}
и я хочу избежать следующего шаблона: (используя this в конструкторе Client)
class Client implements MessageListener
{
MessageReceiver receiver;
MessageSender sender;
public Client(...)
{
receiver = new MessageReceiver(this, other arguments...);
sender = new Sender(...);
}
.
.
.
@Override
public void onMessageReceipt(Message message)
{
if(Message.isGood())
sender.send("Congrtulations");
else
sender.send("Boooooooo");
}
}
Причина, по которой мне нужны вышеуказанные функции, заключается в том, что я хочу вызвать отправителя внутри функции onMessageReceipt (), например, чтобы отправить ответ. Но я не хочу передавать отправителя в прослушиватель, поэтому я могу думать только о том, чтобы содержать отправителя в классе, который реализует прослушиватель, и, следовательно, вышеописанную реализацию Client. Есть ли способ достичь этого без использования «this» в конструкторе? Это кажется странным, и мне это не нравится, так как я передаю себя объекту (MessageReceiver) до того, как я полностью сконструирован. С другой стороны, MessageReceiver не передается извне, он создается внутри, но очищает ли это причудливый паттерн?
Я ищу альтернативу или какую-то гарантию того, что это безопасно, или ситуации, в которых это может иметь неприятные последствия для меня.