java - 如何避免在构造函数中使用 this

标签 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);
  }
}

我想避免以下模式:(在客户端构造函数中使用 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");
  }
}

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

最佳答案

可以将Client的依赖项(例如MessageReceiver)注入(inject)其中,而不是让Client知道如何构造消息接收器:

Client client = new Client(...);
MessageReceiver rcvr = new MessageReceiver(client, ...);
client.setMessageReceiver(rcvr);

但是,我建议考虑打破这两个类之间的循环依赖关系,听起来好像您的设计中有问题。

this 传递给第一个类的构造函数中的另一个类是一种不好的做法的真正原因是,您允许对 this 的引用在完全被调用之前转义。已构建。

关于java - 如何避免在构造函数中使用 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2503036/

相关文章:

c# - 接口(interface)中具有不同参数的策略模式 (C#)

java - 为什么 isInterrupted() 给出 Thread.currentThread().isInterrupted() 以外的结果(JAVA)

JavaMail API 不适用于我,但有异常 com.sun.mail.util.MailConnectException : Couldn't connect to host, 端口

java - 如何使我的 Java Swing 应用程序成为客户端-服务器应用程序?

design-patterns - 实现协议(protocol)的最佳方式是什么?

c# - 我的模型应该是什么样子?

c# - 发送包括 : where, orderby 的整个 lambda 表达式,将 skip 作为参数

java - 如何将类中的属性与字符串进行比较?

java - 对于带有 netty 3.10.6 的套接字客户端,异常 : java. nio.channels.NotYetConnectedException

java - 急切初始化单例 vs 惰性初始化单例