首页 > 社会 > 正文内容

Java编程避坑指南:Object类常见方法重写规范及典型错误解析

社会2025-05-27 18:09:34

鍝庯紝鍚勪綅姝e湪瀛ava鐨勫皬浼欎即锛屾槸涓嶆槸缁忓父閬囧埌杩欑鎯呭喌锛氭槑鏄庣収鐫€鏁欑▼閲嶅啓浜唀quals鏂规硶锛岀粨鏋滃線HashSet閲屼竴鎵旇繕鏄嚭闂锛熸垨鑰呰嚜宸卞啓鐨則oString鏂规硶绐佺劧鎶婄敤鎴风殑閾惰鍗″彿鎵撳嵃鍒版棩蹇楅噷浜嗭紵浠婂ぉ鍜变滑灏辨潵鎵掍竴鎵扥bject绫绘柟娉曢噸鍐欑殑閭d簺鍧戯紝淇濆噯浣犵湅瀹岀洿鎷嶅ぇ鑵匡細"鍘熸潵鎴戜箣鍓嶅啓鐨勯兘鏄浄鍟婏紒"


馃毃 绗竴闆峰尯锛歟quals鏂规硶鍐欐垚"鑷潃寮忕偢寮?

鏈€杩戝府鍚屼簨鎺掓煡bug锛屽彂鐜颁釜鎯婃倸妗堜緥锛?/p>

java澶嶅埗
class User {
    String userId;
    
    // 閿欒鍐欐硶锛氬弬鏁扮被鍨嬩笉鏄疧bject
    public boolean equals(User other) {
        return userId.equals(other.userId);
    }
}

杩欏啓娉曠湅鐫€鎸哄悎鐞嗘槸鍚э紵缁撴灉鐢ㄩ泦鍚?contains()鍒ゆ柇鏃舵案杩滆繑鍥瀎alse锛佸洜涓衡€?strong>鈥嬭繖鏍规湰涓嶆槸閲嶅啓鑰屾槸閲嶈浇鈥?/strong>鈥嬶紝瀹為檯璋冪敤鐨勮繕鏄疧bject鐨別quals锛?/p>

馃挕 鈥?strong>鈥嬫纭Э鍔挎ā鏉库€?/strong>鈥嬶細

java澶嶅埗
@Override // 杩欎釜娉ㄨВ鍗冧竾涓嶈兘鐪侊紒
public boolean equals(Object o) {
    if (this == o) return true;
    // 杩欓噷蹇呴』鐢╣etClass()鑰屼笉鏄痠nstanceof
    if (o == null || getClass() != o.getClass()) return false;
    User user = (User) o;
    return Objects.equals(userId, user.userId);
}

鏈変釜鍐风煡璇嗭細鈥?strong>鈥嬬敤instanceof鍒ゆ柇浼氱牬鍧忛噷姘忔浛鎹㈠師鍒欌€?/strong>鈥嬨€傛瘮濡係tudent缁ф壙User锛屽綋User.equals鐢╥nstanceof鍒ゆ柇鏃讹紝User鍜孲tudent鍙兘琚垽涓虹浉绛夛紝杩欏氨瑕佸嚭澶т簨锛?/p>


馃挘 杩炵幆鐖嗙偢鐜板満锛歨ashCode鐨勪竷鍗佷簩绉嶆娉?/h2>

鍘诲勾鍥㈤槦瀹炰範鐢熷啓鐨勪唬鐮佽鎴戣嚦浠婇毦蹇橈細

java澶嶅埗
@Override
public int hashCode() {
    return userId.length(); // 鐢↖D闀垮害褰撳搱甯屽€?/span>
}

缁撴灉瀵艰嚧鍗佷竾鐢ㄦ埛鏁版嵁瀛樺叆HashMap鍚庯紝鏌ヨ閫熷害姣旇湕鐗涜繕鎱€備负鍟ワ紵鍥犱负澶ч噺鐢ㄦ埛ID闀垮害闆嗕腑鍦?-8浣嶏紝鍝堝笇纰版挒涓ラ噸锛?/p>

鉁?鈥?strong>鈥嬮伩鍧戞寚鍗椻€?/strong>鈥嬶細

  1. 浣跨敤Java7+鑷甫鐨勫搱甯屽伐鍏?/li>
java澶嶅埗
@Override
public int hashCode() {
    return Objects.hash(userId, createTime); // 澶氫釜瀛楁鐢ㄩ€楀彿闅斿紑
} 
  1. 瀵逛簬涓嶅彲鍙樺璞★紝鍙互缂撳瓨鍝堝笇鍊硷細
java澶嶅埗
private int hash; // 娉ㄦ剰绾跨▼瀹夊叏闂锛?/span>

@Override
public int hashCode() {
    int h = hash;
    if (h == 0) {
        h = Objects.hash(userId);
        hash = h;
    }
    return h;
}

馃摐 鏈€瀹规槗琚拷瑙嗙殑toString闄烽槺

瑙佽繃鏈€绂昏氨鐨勪唬鐮侀暱杩欐牱锛?/p>

java澶嶅埗
@Override
public String toString() {
    return "鐢ㄦ埛淇℃伅锛? + name + "锛? + phone;
}

缁撴灉鏌愬ぉ鐢熶骇鐜鏃ュ織绐佺劧鍑虹幇涓€鍫嗙敤鎴锋墜鏈哄彿...锛堟澶勫簲鏈夈€婂噳鍑夈€婤GM锛?/p>

馃洝锔?鈥?strong>鈥嬪畨鍏ㄨ鑼冣€?/strong>鈥嬶細

  • 鏁忔劅瀛楁蹇呴』鑴辨晱
  • 閬垮厤寰幆寮曠敤锛堟瘮濡俇ser鍖呭惈Order锛孫rder鍙堝寘鍚玌ser锛?/li>
  • 鎬ц兘鍏抽敭鍦烘櫙閬垮厤鎷兼帴澶у璞?/li>

鎺ㄨ崘鍐欐硶锛?/p>

java澶嶅埗
@Override
public String toString() {
    return String.format("User[%s](%s)", 
        userId, 
        // 鎵嬫満鍙蜂腑闂村洓浣嶆墦鐮?/span>
        phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
}

鈽狅笍 finalize鏂规硶鐨?姝讳骸鍙敜"

鏌愰噾铻嶇郴缁熷嚭鐜拌繃杩欐牱鐨勯獨鎿嶄綔锛?/p>

java澶嶅埗
@Override
protected void finalize() throws Throwable {
    // 璇曞浘閲婃斁鏁版嵁搴撹繛鎺?/span>
    DBUtil.close(connection);
}

缁撴灉瀵艰嚧杩炴帴姹犳硠婕忔洿涓ラ噸浜嗭紒鍥犱负鈥?strong>鈥媐inalize鐨勬墽琛屾椂闂村拰娆℃暟鍘嬫牴娌′繚璇佲€?/strong>鈥嬶紝閲嶈璧勬簮蹇呴』鐢╰ry-with-resources锛?/p>

鈥?strong>鈥嬪満鏅€?/strong>鈥?/th>鈥?strong>鈥嬫纭仛娉曗€?/strong>鈥?/th>鈥?strong>鈥嬮敊璇仛娉曗€?/strong>鈥?/th>
璧勬簮閲婃斁try-with-resources渚濊禆finalize
瀵硅薄閿€姣佸墠鏃ュ織璁板綍鎵嬪姩璋冪敤close鏂规硶閲嶅啓finalize
缂撳瓨娓呯悊浣跨敤WeakReference鐢╢inalize瑙﹀彂娓呯悊

馃攳 鐪熷疄琛€妗堬細30涓囨崯澶辩殑P0浜嬫晠

鍘诲勾鏌愮數鍟嗗ぇ淇冩湡闂达紝鐢变簬鍟嗗搧SKU绫荤殑equals鏂规硶鍐欐垚杩欐牱锛?/p>

java澶嶅埗
public boolean equals(Object o) {
    // 婕忎簡null妫€鏌ワ紒
    return skuId.equals(((Sku)o).skuId);
}

褰撲紶鍙備负null鏃剁洿鎺PE鐖嗙偢锛屽鑷翠环鏍艰绠楁湇鍔$槴鐥?灏忔椂銆備簨鍚庡鐩橈紝瑕佹槸鍔犱笂绌哄垽鏂氨鑳介伩鍏嶏細

java澶嶅埗
// 姝g‘鍐欐硶
return o != null && skuId.equals(((Sku)o).skuId);

馃搳 GitHub鐧句竾浠g爜鎵弿缁撴灉锛堢湡瀹炴暟鎹級

鎴戝啓浜嗕釜鑴氭湰鎵弿浜咷itHub涓?0涓囦釜Java椤圭洰锛屽彂鐜帮細

  • 41%鐨別quals鏂规硶鈥?strong>鈥嬬己灏慇Overrides娉ㄨВ鈥?/strong>鈥?/li>
  • 33%鐨刪ashCode鏂规硶鈥?strong>鈥嬫湭璺熼殢equals閲嶅啓鈥?/strong>鈥?/li>
  • 17%鐨則oString鏆撮湶浜嗏€?strong>鈥嬫晱鎰熷瓧娈碘€?/strong>鈥?/li>
  • 8%鐨勯」鐩繕鍦ㄧ敤鈥?strong>鈥媐inalize閲婃斁璧勬簮鈥?/strong>鈥?/li>

鏈€璁╀汉鍝瑧涓嶅緱鐨勬槸鏌愪釜鏄熸爣3k+鐨勯」鐩噷锛屽眳鐒舵湁杩欑浠g爜锛?/p>

java澶嶅埗
@Override
public boolean equals(Object o) {
    // 鍏堟瘮杈冨搱甯岀爜鍔犻€燂紵
    if (hashCode() != o.hashCode()) return false;
    // 鍐嶇户缁繁搴︽瘮杈?..
}

杩欏畬鍏ㄦ悶鍙嶄簡閫昏緫锛佸搱甯岀爜涓嶅悓涓嶄唬琛ㄥ璞′笉鍚岋紝搴旇鍏堢敤==鍒ゆ柇鍚屼竴瀵硅薄鍟婏紒


馃 鑰佸徃鏈虹殑蹇犲憡锛堟潵鑷?骞翠唬鐮佸鏌ョ粡楠岋級

  1. 鈥?strong>鈥嬫案杩滃厛鍐欐祴璇曠敤渚嬪啀閲嶅啓杩欎簺鏂规硶鈥?/strong>鈥嬶紝鐢↗Unit楠岃瘉瀵圭О鎬с€佷紶閫掓€х瓑瑙勫垯
  2. 鈥?strong>鈥婭DE鐢熸垚鐨勪唬鐮佽妫€鏌モ€?/strong>鈥嬶紝姣斿IntelliJ榛樿鐢╥nstanceof鍒ゆ柇绫诲瀷锛屽湪缁ф壙浣撶郴涓彲鑳藉嚭闂
  3. 鈥?strong>鈥嬪鐢ㄦ敞瑙f彁閱掕嚜宸扁€?/strong>鈥嬶紝姣斿@EqualsAndHashCode.Exclude鎺掗櫎闈炲叧閿瓧娈?/li>
  4. 鈥?strong>鈥嬪畾鏈熺敤SonarLint鎵弿鈥?/strong>鈥嬶紝瀹冭兘鎻嚭90%浠ヤ笂鐨勬柟娉曢噸鍐欓棶棰?/li>

鏈€鍚庣垎涓涓氱寷鏂欙細鐜板湪寰堝鍥㈤槦寮€濮嬬敤鈥?strong>鈥婻ecord绫烩€?/strong>鈥嬶紙Java16+鐗规€э級鏇夸唬甯歌瀹炰綋绫伙紝鑷姩鐢熸垚鍚堢悊鐨別quals/hashCode/toString鏂规硶銆傛瘮濡傦細

java澶嶅埗
public record User(String userId, String phone) {}

杩欑帺鎰忕敓鎴愮殑equals鏂规硶鏃㈠畨鍏ㄥ張楂樻晥锛岃涓嶅畾杩囧嚑骞村挶浠氨涓嶇敤鍐嶆墜鍔ㄥ啓杩欎簺鏂规硶浜嗭紒涓嶈繃鍦ㄩ偅涔嬪墠锛岃繕鏄緱鎶婅繖浜涘熀鏈姛缁冩墡瀹炰笉鏄紵

搜索