0

所以,我正在制作一个全屏应用程序并遇到了一些奇怪的事情。

方法 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

4

1 回答 1

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;
}
于 2016-05-17T18:35:56.090 回答