EffectiveJava 1創建和銷燬對象 10始終要覆蓋toString

1    重點關注

 

2    課程內容

 

3    代碼演練

3.1    核心代碼 覆蓋toString方法 

/**
     * %d 整數類型(十進制)
     * %03d 如果小於3位,前方補0
     *
     * 按照指定格式打印
     *
     * @author weidoudou
     * @date 2022/7/7 8:29
     * @param
     * @return java.lang.String
     **/
    @Override
    public String toString(){
        return String.format("(%03d) %03d-%04d",areaCode,prefix,lineNumber);
    }

 

 

3.2    反例 未覆蓋toString方法

實例:

package com.ddwei.test.core.chapter10.demo1;

import java.util.HashMap;
import java.util.Map;

public final class PhoneNumber {
    private final short areaCode;
    private final short prefix;
    private final short lineNumber;

    public PhoneNumber(short areaCode, short prefix, short lineNumber) {
        rangeCheck(areaCode, 999, "area code");
        rangeCheck(prefix, 999, "prefix");
        rangeCheck(lineNumber, 9999, "line number");
        this.areaCode = (short)areaCode;
        this.prefix = (short)prefix;
        this.lineNumber = (short)lineNumber;
    }
    private static void rangeCheck(int arg,int max,String name) {
        if(arg < 0 || arg > max)
            throw new IllegalArgumentException(name +": "+ arg);
    }

    @Override
    public boolean equals(Object obj) {
        //1、使用==操作符檢查“參數是否爲這個對象的引用”
        if(obj == this)
            return true;
        //2、使用instanceof操作符檢查“參數是否爲正確的類型”
        if(!(obj instanceof PhoneNumber))
            return false;
        //3、把參數轉化成正確的類型
        PhoneNumber pn = (PhoneNumber)obj;
        //4、對於該類的每個“關鍵”域,檢查參數中的域是否與該對象中對應的域相匹配(其實就是比較兩個對象的值是否相等了)
        return pn.lineNumber == lineNumber
            && pn.prefix == prefix
            && pn.areaCode == areaCode;
    }

 

    public static void main(String[] args) {
        short s1 = 707;
        short s2 = 867;
        short s3 = 5309;
        PhoneNumber phoneNumber = new PhoneNumber(s1,s2,s3);
        System.out.println(phoneNumber.toString());
    }
}

 

測試結果:

com.ddwei.test.core.chapter10.demo1.PhoneNumber@7699a589

Process finished with exit code 0

 

 

3.3    正例  覆蓋toString方法

實例:

package com.ddwei.test.core.chapter10.demo2;

public final class PhoneNumber {
    private final short areaCode;
    private final short prefix;
    private final short lineNumber;

    public PhoneNumber(short areaCode, short prefix, short lineNumber) {
        rangeCheck(areaCode, 999, "area code");
        rangeCheck(prefix, 999, "prefix");
        rangeCheck(lineNumber, 9999, "line number");
        this.areaCode = (short)areaCode;
        this.prefix = (short)prefix;
        this.lineNumber = (short)lineNumber;
    }
    private static void rangeCheck(int arg,int max,String name) {
        if(arg < 0 || arg > max)
            throw new IllegalArgumentException(name +": "+ arg);
    }

    @Override
    public boolean equals(Object obj) {
        //1、使用==操作符檢查“參數是否爲這個對象的引用”
        if(obj == this)
            return true;
        //2、使用instanceof操作符檢查“參數是否爲正確的類型”
        if(!(obj instanceof PhoneNumber))
            return false;
        //3、把參數轉化成正確的類型
        PhoneNumber pn = (PhoneNumber)obj;
        //4、對於該類的每個“關鍵”域,檢查參數中的域是否與該對象中對應的域相匹配(其實就是比較兩個對象的值是否相等了)
        return pn.lineNumber == lineNumber
            && pn.prefix == prefix
            && pn.areaCode == areaCode;
    }

    /**
     * %d 整數類型(十進制)
     * %03d 如果小於3位,前方補0
     *
     * 按照指定格式打印
     *
     * @author weidoudou
     * @date 2022/7/7 8:29
     * @param
     * @return java.lang.String
     **/
    @Override
    public String toString(){
        return String.format("(%03d) %03d-%04d",areaCode,prefix,lineNumber);
    }

    public static void main(String[] args) {
        short s1 = 007;
        short s2 = 867;
        short s3 = 5309;
        PhoneNumber phoneNumber = new PhoneNumber(s1,s2,s3);
        System.out.println(phoneNumber.toString());
    }
}

 

測試結果:

(007) 867-5309

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章