2010-02-16 3 views
8

Je suis en train de réviser du code que je n'ai pas écrit qui utilise JavaMail, et qui a un peu de mal à comprendre pourquoi l'API JavaMail est conçue comme elle est. J'ai le sentiment que si je comprenais, je pourrais faire un meilleur travail.Pourquoi JavaMail Transport.send() est une méthode statique?

Nous appelons:

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

Alors pourquoi me prévenir Eclipse que ceci:

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

est un appel à une méthode statique? Pourquoi est-ce que j'obtiens un objet Transport et que je fournis des paramètres qui lui sont spécifiques si je ne peux pas utiliser cet objet pour envoyer le message? Comment la classe Transport sait-elle même quel serveur et d'autres paramètres utiliser pour envoyer le message? Cela fonctionne bien, ce qui est difficile à croire. Que se passerait-il si j'avais instancié des objets de transport pour deux serveurs différents; comment pourrait-il savoir lequel utiliser?

Au cours de la rédaction de cette question, j'ai découvert que je devrais vraiment Vocation:

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

Quel est donc le but de la méthode Transport.send() statique? Est-ce juste une mauvaise conception, ou y a-t-il une raison à cela?

Répondre

8

Transport.send() est essentiellement une méthode pratique. Oui, si vous gérez votre propre instance Transport, appelez le sendMessage().

Je ne suis pas sûr que je considère cela comme une mauvaise conception, car souvent vous ne vous souciez pas de gérer les détails de l'envoi et de la surveillance du transport. Crack ouvrir la méthode send() pour voir ce qu'il fait pour vous. D'autres façons de nommer ou de placer cette méthode pourraient être légèrement meilleures.

5

Le javadoc dit:

Envoyer est une méthode statique qui crée et gère sa propre connexion. Toute connexion associée à une instance de transport utilisée pour appeler cette méthode est ignorée et non utilisée. Cette méthode doit uniquement être appelée à l'aide du formulaire Transport.send (msg) ;, et ne doit jamais être appelée à l'aide d'une variable d'instance.

Et oui probablement, la conception est pas bon

Questions connexes