所以,我正在制作一个全屏应用程序并遇到了一些奇怪的事情。
方法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 Docs显示有两个重载版本的.equals()方法,一个带有DisplayMode对象,另一个带有Java.Lang.Object对象? https://docs.oracle.com/javase/7/docs/api/java/awt/DisplayMode.html
答案 0 :(得分: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;
}