9

我正在修改我没有编写的使用 JavaMail 的代码,并且在理解 JavaMail API 的设计方式时遇到了一些麻烦。我有一种感觉,如果我理解了,我可以做得更好。

我们称之为:

transport = session.getTransport("smtp");
transport.connect(hostName, port, user, password);

那么为什么 Eclipse 会警告我:

transport.send(message, message.getAllRecipients());

是调用静态方法吗?

如果我不能使用该对象发送消息,为什么我会获得一个 Transport 对象并提供特定于它的设置?传输类甚至如何知道用于发送消息的服务器和其他设置?它工作正常,这很难相信。如果我为两个不同的服务器实例化了 Transport 对象会怎样?它怎么知道使用哪一个?

在写这个问题的过程中,我发现我真的应该打电话:

transport.sendMessage(message, message.getAllRecipients());

那么静态 Transport.send() 方法的目的是什么?这只是糟糕的设计,还是有这样的原因?

4

2 回答 2

8

Transport.send()基本上是一种方便的方法。是的,如果您要管理自己的Transport实例,请致电sendMessage().

我不确定我是否认为它是糟糕的设计,因为您经常不关心管理发送和监控传输的细节。破解打开send()方法,看看它对你有什么作用。命名或放置此方法的其他方式可能会稍微好一些。

于 2010-02-16T16:52:59.797 回答
5

javadoc 说:

Send 是一个静态方法,它创建和管理自己的连接。与用于调用此方法的任何传输实例关联的任何连接都将被忽略且不使用。此方法只能使用 Transport.send(msg); 形式调用,并且绝不应该使用实例变量调用。

是的,可能设计不好

于 2010-02-16T16:49:06.120 回答