簡體   English   中英

僅覆蓋Java對象的equals()方法

[英]Override equals() method only of a Java object

我正在開發一個使用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

您只需要在不檢查要忽略的字段的情況下實現它。 不要忘記覆蓋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
}

擴展ScanResult類並僅覆蓋equals()方法

class CustomScanResult extends ScanResult {

    @Override
    public boolean equals(Object o) {
        // ... custom logic ...
    }

}

這是你的Overriden 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;
    }
}

簡單的方法使用檢查所有變量為true。 例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM