如何避免在构造函数中使用它

Par*_*ife 2 java design-patterns

我有这种情况:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我想避免以下模式:(在客户端构造函数中使用this)

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要上述功能的原因是因为我想在onMessageReceipt()函数中调用发送者,例如发送回复.但是我不想将发送者传递给监听器,所以我能想到的唯一方法就是在实现监听器的类中包含发送者,因此产生上述客户端实现.有没有办法在构造函数中不使用'this'来实现这个目的?感觉很奇怪,我不喜欢它,因为我在完全构建之前将自己传递给一个对象(MessageReceiver).另一方面,MessageReceiver不是从外部传递的,它是在内部构造的,但这是否"净化"了奇怪的模式?我正在寻找一种替代或某种保证,这种安全,或者它可能适得其反.

mat*_*t b 6

Client的依赖(如MessageReceiver)可能会被注入到它,而不是让Client懂得如何构建MessageReceiver:

Client client = new Client(...);
MessageReceiver rcvr = new MessageReceiver(client, ...);
client.setMessageReceiver(rcvr);
Run Code Online (Sandbox Code Playgroud)

但是我建议考虑打破这两个类之间的循环依赖关系,听起来好像你的设计中有些东西已经关闭.

this在第一个类的构造函数中传递给另一个类的真正原因是一个不好的做法是因为this在完全构造之前允许引用转义.