2010-02-16 9 views
8

Ich überarbeite den Code, den ich nicht geschrieben habe, der JavaMail verwendet, und habe ein kleines Problem damit zu verstehen, warum das JavaMail-API so entwickelt wurde, wie es ist. Ich habe das Gefühl, wenn ich es verstehe, könnte ich einen besseren Job machen.Warum ist JavaMail Transport.send() eine statische Methode?

Wir nennen:

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

Warum Eclipse warnt mich, dass dies:

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

ein Aufruf einer statischen Methode ist?

Warum erhalte ich ein Transport-Objekt und biete spezifische Einstellungen an, wenn ich dieses Objekt nicht zum Senden der Nachricht verwenden kann? Wie weiß die Transport-Klasse überhaupt, welche Server- und andere Einstellungen zum Senden der Nachricht verwendet werden? Es funktioniert gut, was kaum zu glauben ist. Was wäre, wenn ich Transportobjekte für zwei verschiedene Server instanziiert hätte? Woher sollte es wissen, welche zu verwenden?

Im Zuge diese Frage zu schreiben, habe ich entdeckt, dass ich wirklich anrufen soll:

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

Also, was der Zweck der statischen Transport.send() Methode ist? Ist das nur ein schlechtes Design oder gibt es einen Grund dafür?

Antwort

8

Transport.send() ist im Grunde eine bequeme Methode. Ja, wenn Sie Ihre eigene Transport Instanz verwalten, rufen Sie sendMessage().

Ich bin mir nicht sicher, ob ich es für ein schlechtes Design halte, da es häufig nicht wichtig ist, die Details zum Senden und Überwachen des Transports zu verwalten. Öffnen Sie die send() Methode, um zu sehen, was es für Sie tut. Andere Möglichkeiten zur Benennung oder Platzierung dieser Methode könnten geringfügig besser sein.

5

Die javadoc sagt:

Senden eine statische Methode ist, das seine eigene Verbindung erstellt und verwaltet. Jede Verbindung, die einer Transportinstanz zugeordnet ist, die zum Aufrufen dieser Methode verwendet wird, wird ignoriert und nicht verwendet. Diese Methode sollte nur mit dem Formular Transport.send (msg); aufgerufen werden und sollte niemals mit einer Instanzvariablen aufgerufen werden.

Und ja wohl, das Design ist nicht gut

Verwandte Themen