2016-05-17 5 views
0

Also mache ich eine Vollbild-Anwendung und stieß auf etwas seltsam.DisplayMode.equals (DisplayMode dm) Verwirrung

Die Methode DisplayMode.equals (DisplayMode dm) wird außer Kraft gesetzt, aber ich denke nicht, dass sie richtig implementiert ist. Der folgende Code druckt falsch an die Konsole:

public static void main(String[] args){ 
    DisplayMode mode = new (1,2,16, DisplayMode.REFRESH_RATE_UNKNOWN); 
    System.out.println(mode.equals(new DisplayMode(1, 2, 16, 60))); 
} 

Wenn die Anzeige-Modi die gleiche sparen für ihre Bildwiederholraten sind, und einer von ihnen ist nicht bekannt, dann denke ich, dass sie gleich sein sollten. Warum ist das nicht der Fall, und kann mir jemand einen Workaround empfehlen? Warum zeigen die Java Docs online, dass es zwei überladene Versionen der .equals() -Methode gibt, eine mit einem DisplayMode-Objekt und eine mit einem Java.Lang.Object-Objekt? https://docs.oracle.com/javase/7/docs/api/java/awt/DisplayMode.html

Antwort

0

Der Unterschied, den ich glaube, ist, dass Sie im ersten Fall sagen "Ich weiß, dass die Aktualisierungsrate unbekannt ist" und im zweiten Fall sagen Sie "Ich weiß genau, dass die Bildwiederholrate beträgt 60 ".

Die Implementierung von grepcode zeigt folgendes:

public boolean equals(DisplayMode dm) { 
    if (dm == null) { 
     return false; 
    } 
    return (getHeight() == dm.getHeight() 
     && getWidth() == dm.getWidth() 
     && getBitDepth() == dm.getBitDepth() 
     && getRefreshRate() == dm.getRefreshRate()); 
} 

können Sie sehen, dass es den Wert der Bildwiederholfrequenz am Boden vergleicht.

java.awt.DisplayMode#REFRESH_RATE_UNKNOWN ist definiert als 0.

Wie für die zweite Frage, warum diese Überladung die equals Methode, ermöglicht es den Code zu trennen und nur auf den Teil konzentrieren, die es interessiert. wenn er nicht überlastet wurde, zum Beispiel der equals Methode würde so aussehen

public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 

    if (obj instanceof DisplayMode) { 
     DisplayMode dm = (DisplayMode) obj; 

     return (getHeight() == dm.getHeight() 
      && getWidth() == dm.getWidth() 
      && getBitDepth() == dm.getBitDepth() 
      && getRefreshRate() == dm.getRefreshRate()); 
    } 

    return false; 
} 
+0

Warum gibt es eine .equals() Methode für dieses Objekt außer Kraft gesetzt, aber nicht die viele Dutzende von anderen Objekten in den Java-Bibliotheken? –

+0

@AviCaspe Ich bin mir der Antwort nicht sicher. Es kann eine Leistungsüberlegung geben. Zur Kompilierzeit kann der Compiler in diesem Fall angeben, welche Methode genau aufgerufen werden soll; Wenn Sie also zwei "DisplayMode" -Objekte vergleichen möchten, würden Sie einige Anweisungen speichern, indem Sie denjenigen aufrufen, der einen 'DisplayMode' als Argument verwendet, anstatt den, der ein' Object' nimmt. Eine andere Sache, die in Betracht gezogen werden sollte, ist, dass Anmerkungen nicht vorhanden waren, als diese Klasse hinzugefügt wurde, so dass Sie '@ Override' nicht verwenden konnten, was möglicherweise etwas damit zu tun hat. – Zymus