更好的重寫toString方法

toString方法的規定

建議你始終要重寫toString方法java

雖然java.lang.Object提供了toString方法的一個實現,但它返回的字符串一般不是咱們所但願看到的:ide

// test.ch02.PhoneNumber@12960c
System.out.println(new PhoneNumber(707, 867, 5309));

它會輸出類的名稱,以及一個@符號,藉着是散列碼的無符號十六進制表示法。優化

toString方法的通用約定是:被toString方法返回的字符串,應該是一個簡潔的,但信息豐富,而且易於閱讀的表達形式。spa

如何重寫toString方法

在重寫toString時,須要作出一個重要的決定:是否在toString中,制定返回值的格式。就拿上面的PhoneNumber來講,是否要返回一個707-867-5309的固定電話號碼格式。.net

使用格式的好處是,toString方法會返回標準的、明確的、適合人閱讀的對象表示法,例如:3d

@Override
public String toString() {
    return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber);
}
// (707) 867-5309
System.out.println(new PhoneNumber(707, 867, 5309));

不足之處是,若是這個類被方法使用,一旦指定格式,就必須始終如一的堅持使用下去。code

若是不定製格式,則能夠憑本身的想法返回信息,現代IDE都會生成對象的信息。orm

不管是否使用格式,都應該在註釋中,明確說明toString的意圖。對象

例如要指定格式,註釋可參考:字符串

/**
     * 返回此電話號碼的字符串表示形式。
     * 該字符串由十四個字符組成,其格式爲「(XXX) YYY-ZZZZ」
     * XXX是areaCode,YYY是prefix,ZZZZ是lineNumber
     * <p>
     * 若是這個電話號碼的三個部分都過小,不能填滿它的字段,能夠用0填充。
     * 例如lineNumber是"123",則可填寫成"0123"。
     * <p>
     * 注意,(areaCode)和prefix中間有一個空格。
     */
    @Override
    public String toString() {
        return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber);
    }

若是不指定格式,也應該在註釋中有所指明:

/**
     * 返回一個簡要說明,具體細節未經說明,並有可能發生變化。
     * 如下是一個簡單的實例:
     * [PhoneNumber: areaCode=123, prefix=456, lineNumber=7890]
     */
    @Override
    public String toString() {
        return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber);
    }

重寫toString方法優化

  • 提供好的toString實現能夠使類用起來更加溫馨;
  • 在實際應用中,若是對象太大,或信息難以用字符串表達,就應該返回一個摘要信息;
  • 應該爲toString返回值中包含的全部信息,提供一個getter方法;
相關文章
相關標籤/搜索