我有这样的情况:
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/