【问题标题】:Override equals() method only of a Java object仅覆盖 Java 对象的 equals() 方法
【发布时间】:2013-04-08 18:11:35
【问题描述】:

我正在开发一个使用ScanResult 对象的Android 应用程序。该对象的形式为:

[SSID: __mynetwork__, BSSID: 00:0e:2e:ae:4e:85, capabilities: [WPA-PSK-TKIP][ESS], level: -69, frequency: 2457, timestamp: 117455824743]

如何仅覆盖 equals() 方法而不创建扩展它的客户类以便仅比较 SSIDBSSIDcapabiltieslevelfrequency 属性?换句话说,在equals 方法中我想消除timestamp 属性,这样当我比较这两个对象时,equals() 方法将返回一个true 值:

[SSID: __mynetwork__, BSSID: 00:0e:2e:ae:4e:85, capabilities: [WPA-PSK-TKIP][ESS], level: -69, frequency: 2457, timestamp: 117455824743]
[SSID: __mynetwork__, BSSID: 00:0e:2e:ae:4e:85, capabilities: [WPA-PSK-TKIP][ESS], level: -69, frequency: 2457, timestamp: 117460312231]

注意:当我派生一个扩展 ScanResult 的客户类时,我在尝试实现构造函数时收到以下错误:The constructor ScanResult() is not visible

【问题讨论】:

  • 覆盖它并且不提供时间戳检查,只需将其省略即可。
  • 我应该创建一个扩展equals方法的自定义类吗?
  • 问题是我是否可以只覆盖该方法而不创建扩展它的新类
  • 不,你不能那样做
  • 你对需要 equals() 覆盖的对象做了什么?

标签: java android overriding equals


【解决方案1】:

您只需在不检查要忽略的字段的情况下实现它。不要忘记也覆盖 hashode()。

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((field1 == null) ? 0 : field1.hashCode());
    result = prime * result + ((field2 == null) ? 0 : field2.hashCode());
            ...etc
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    ScanResult other = (ScanResult ) obj;
    if (field1 == null) {
        if (other.field1 != null)
            return false;
    } else if (!field1.equals(other.field1))
        return false;
    if (field2 == null) {
        if (other.field2 != null)
            return false;
    } else if (!field2 .equals(other.field2 ))
        return false;
        }
... etc
}

【讨论】:

    【解决方案2】:

    这是你重写的 equals() 方法....

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ScanResult)) return false;
    
        if(!BSSID.equals(o.BSSID)) return false;
        if(!SSID.equals(o.SSID)) return false;
        if(!capabilities.equals(o.capabilities)) return false;
        if(frequency != o.frequency) return false;
        if(level != o.level) return false;
    
        return true;
    }
    

    编辑

    既然上述解决方案不起作用,我可以建议:

    class ScanResultComparator {
        public static boolean equals(ScanResult a, ScanResult b){
            if(!a.BSSID.equals(b.BSSID)) return false;
            if(!a.SSID.equals(b.SSID)) return false;
            if(!a.capabilities.equals(b.capabilities)) return false;
            if(a.frequency != b.frequency) return false;
            if(a.level != b.level) return false;
    
            return true;
        }
    }
    

    【讨论】:

    • 我相信如果所有这些都应该在一个“if”块中。例如if(!a.BSSID.equals(b.BSSID) || !a.SSID.equals(b.SSID) ... ){
    【解决方案3】:

    扩展ScanResult 类并且只覆盖equals() 方法

    class CustomScanResult extends ScanResult {
    
        @Override
        public boolean equals(Object o) {
            // ... custom logic ...
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      简单的方法使用检查所有变量是否为真。 示例:

      public class FtpFile {
      
          public String host;
          public String port;
          public String fileName;
          public String path;
          public String username;
          public String password;
      
          /**
           * Override Equals()
           */
          @Override
          public boolean equals(Object o) {
              try {
                  if (o == null || getClass() != o.getClass())
                      return false;
      
                  FtpFile p = (FtpFile) o;
                  return ((host.equals(p.host))
                          && (port.equals(p.port))
                          && (path.equals(p.path))
                          && (username.equals(p.username))
                          && (password.equals(p.password)));
              } catch (Exception ex) {
                  return false;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-30
        • 2014-05-27
        • 2010-09-16
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        相关资源
        最近更新 更多