2014-04-04 10 views
6

Ich machte eine Swing-Anwendung und erkannte, dass ich eine Handvoll Klassen hatte, die Zugriff auf die gleichen Konstanten benötigten. Ich konnte mich nicht dazu durchringen, einen der Haupthalter von ihnen zu erklären und sie alle dort hineinzustellen und die anderen darauf hinweisen zu lassen; Ich dachte, hey, ich werde sie alle nur von einem gewöhnlichen Ort erben lassen, aber Java macht keine Mehrfachvererbung, ABER ich kann Unendlichkeitsschnittstellen auf Dinge setzen. Also kam die Idee zu mir, sie alle in eine Schnittstelle zu packen (es ist natürlich nur mir aufgefallen, ohne nachzuforschen).Wenn das konstante Interface-Anti-Pattern ein solches Verbrechen ist, warum macht Swing das?

Später erfuhr ich, dass dies Häresie ist. "In der Tat ist es so eine schlechte Idee, dass es einen Namen dafür gibt: die Constant Interface Antipattern" - as discussed here (zusammen mit einer alternativen Lösung (die ich gewählt habe)).

war ich damit ganz gut, bis ich auf den Quellcode für JDialog und JFrame, die thusly lesen anschaute:

public class JDialog extends Dialog implements WindowConstants, 
               Accessible, 
               RootPaneContainer, 
           TransferHandler.HasGetTransferHandler 
{ 
... 

und

public class JFrame extends Frame implements WindowConstants, 
              Accessible, 
              RootPaneContainer, 
          TransferHandler.HasGetTransferHandler 
{ 
... 

Vielleicht ist es nur mich, aber ich sicher, Sehen Sie dort eine konstante Schnittstelle. Noch interessanter war eine der Autorenerklärungen in JDialog, d. H. James Gosling. Der Vater der Sprache erlaubte diesen angeblichen Fehler auf seiner Uhr?

(Ein weiteres bemerkenswertes Beispiel - SwingConstans)

Wenn die Konstante Schnittstelle Antipattern so eine schlechte Idee ist, warum ist es dann so schwer in einem der berühmtesten Pakete der Sprache verwendet (das heißt swing)?

+0

Ich hasse wirklich die Swing-Konstanten. Wirklich wirklich, wirklich. – Leo

+0

Diese Klassen sind älter als die Java-Enums. Das ist wahrscheinlich der Grund warum. –

+0

Aus Neugier, warum nicht die Konstanten statisch importieren? –

Antwort

6

Die bessere Lösung der Verwendung von static import war vor Java 5 nicht verfügbar. Bis zu diesem Punkt wurde der Missbrauch von Schnittstellen zum Importieren von Konstanten als akzeptabel angesehen, weil es keine bessere Alternative gab. Sobald Sie entschieden haben, dass JDialog implementiert WindowConstants (und dies in den Dokumenten behauptet), können Sie es nicht rückgängig machen, ohne Abwärtskompatibilität zu brechen. Beispiel:

JDialog d = new JDialog(); 
int flag = d.DISPOSE_ON_CLOSE; 

Während wahrscheinlich nicht gut Stil, das ist nicht so ungewöhnlich, und brechen würde, wenn wir JDialog ändern würden statische Importe zu verwenden, anstatt WindowConstants umzusetzen.