建議你始終要重寫toString方法java
雖然java.lang.Object提供了toString方法的一個實現,但它返回的字符串一般不是咱們所但願看到的:ide
// test.ch02.PhoneNumber@12960c System.out.println(new PhoneNumber(707, 867, 5309));
它會輸出類的名稱,以及一個@符號,藉着是散列碼的無符號十六進制表示法。優化
toString方法的通用約定是:被toString方法返回的字符串,應該是一個簡潔的,但信息豐富,而且易於閱讀的表達形式。spa
在重寫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); }