2016-05-17 6 views
0

Итак, я делаю полноэкранное приложение и сталкивался с чем-то странным.DisplayMode.equals (DisplayMode dm) Confusion

Метод DisplayMode.equals (DisplayMode dm) переопределен, но я не думаю, что он реализован совершенно правильно. Следующий печатает код ложной консоли:

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))); 
} 

Если режимы отображения одинаково за исключение их частоту обновления, и один из них неизвестен, то я думаю, что они должны быть равны. Почему это не так, и может ли кто-нибудь предложить обходной путь для меня? Кроме того, почему онлайн-документы Java показывают, что есть две перегруженные версии метода .equals(), один с объектом DisplayMode и один с объектом Java.Lang.Object? https://docs.oracle.com/javase/7/docs/api/java/awt/DisplayMode.html

ответ

0

Разница в том, что в первом случае вы говорите: «Я знаю, что частота обновления неизвестна», а во втором случае вы говорите «Я знаю, что частота обновления составляет 60 дюймов.

Реализация от grepcode показывает следующее:

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

вы можете увидеть, что он сравнивает значение частоты обновления в нижней части.

java.awt.DisplayMode#REFRESH_RATE_UNKNOWN определяется как 0.

Что касается второго вопроса, то почему это перегружает метод equals, он позволяет разделить код и сосредоточиться только на той части, о которой она заботится. Например, если бы он не был перегружен, метод equals будет выглядеть

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

Почему существует .equals метод() переопределены для этого объекта, но не многие десятки других объектов в библиотеках Java? –

+0

@AviCaspe Я не уверен в ответе. Это может быть связано с оценкой эффективности. Во время компиляции компилятор может указать, какой именно метод вызывать в этом случае; поэтому, если вы хотите сравнить два объекта DisplayMode, вы сохранили бы пару инструкций, вызвав тот, который принимает «DisplayMode» в качестве аргумента, вместо того, чтобы принимать «Object». Еще одна вещь, которую следует учитывать, заключается в том, что аннотации не существовали, когда этот класс был добавлен, поэтому вы не могли использовать '@ Override', который может что-то с ним делать. – Zymus