DisplayMode.equals(DisplayMode dm) Путаница

Итак, я делаю полноэкранное приложение и наткнулся на что-то странное.

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

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

1 ответ

Разница, на мой взгляд, в том, что в первом случае вы говорите: "Я точно знаю, что частота обновления неизвестна", а во втором случае вы говорите: "Я знаю, что частота обновления равна 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;
}
Другие вопросы по тегам