問題
在維持能控制其輸出,內(nèi)容和格式時(shí)才需要自定義toString()
jakarta commons commons-lang-2.4.jar提供功能
1、ReflectionToStringBuilder.reflectionToString(this); 或者其它的ReflectionToStringBuilder.toString(..).;
2、在提供ReflectionToStringBuilder的同時(shí),Commons Lang也通過ToStringBuilder和ToStringStyle類提供了定制功能. 可以通過傳給ToStringBuilder類一個(gè)ToStringStyle對(duì)象來定制.下面的示例實(shí)現(xiàn)了一個(gè)即定制了樣式又定制了內(nèi)容的 toString()方法:
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
public String toString(){
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE).
append("lastName",lastName).
append("firstName",firstName).
toString();
}
上述toString()方法只輸出由append()參數(shù)指定的那兩個(gè)屬性.如下所示:
com.dscursive.jccook.lang.builders.PoliticalCandidate@1cd2e5f[
lastName=Jefferson
firstName=Thomas
]
使用反射生成toString()的內(nèi)容有利于節(jié)省時(shí)間,但這樣做只能全部輸出該類的成員變量.如果想輸出指定的幾個(gè)變量怎么辦?
如果類里面的一些內(nèi)容不便輸出呢?此外,一個(gè)對(duì)象可能有很多屬性,或者某個(gè)屬性含有大量的文本內(nèi)容.在這種情況下,使用
ReflectionToStringBuilder輸出類中每個(gè)變量是不可行的.
使用ToStringBuilder時(shí),可借助ToStringStyle類的靜態(tài)成員來定制輸出內(nèi)容.ToStringBuilder的構(gòu)造函數(shù)接受一個(gè)對(duì)象實(shí)例
和一個(gè)ToStringStyle樣式作為參數(shù),返回一個(gè)ToStringBuilder類實(shí)例.該生成器接著通過append()被定制,append()方法指定
哪些屬性會(huì)被輸出.定制ToStringBuilder時(shí),你需要手動(dòng)添加各個(gè)屬性到生成器實(shí)例中.append()方法可以接受所有基本類型,
對(duì)象和數(shù)組.
如:
append(int value) 添加整數(shù)值
append(String n,int value) 添加整數(shù)值和屬性名
append(Object value) 添加對(duì)象的toString()方法
append(String n,Object value) 添加對(duì)象的toString()方法和屬性名
append(int[] array) 添加格式化后的數(shù)組內(nèi)容
append(Object[] array)
append(String n,int[] array) 添加屬性名和數(shù)組大小
append(String n,Object[] array)
append(String n,int[] array,boolean detail) 添加屬性名和數(shù)組全部?jī)?nèi)容.
ToStringStyle類提供了對(duì)ToStringBuilder類輸出進(jìn)行定制的機(jī)制,同時(shí)也提供幾種內(nèi)建樣式.ToStringStyle.
MULTI_LINE_STYLE是這些樣式之一,其作用是在每?jī)蓚€(gè)屬性之間插入換行符.另一個(gè)例子是ToStringStyle.
SIMPLE_STYLE,它的作用是簡(jiǎn)單地輸出每個(gè)變量的值.下面每個(gè)內(nèi)置樣式都提供了一個(gè)示例:
ToStringStyle.DEFAULT_STYLE
com.discursive.jccook.lang.builders.PoliticalCandidate@1cd2e5f[lastname=Jefferson,firstname=Thomas]
ToStringStyle.MULTI_LINE_STYLE
com.discursive.jccook.lang.builders.PoliticalCandidate@1cd25f[
lastName=Jefferson
firstName=Thomas
]
ToStringStyle.NO_FIELD_NAMES_STYLE
com.discursive.jccook.lang.builders.PoliticalCandidate@icd2e5f[Jefferson,Thomas]
ToStringStyle.SIMPLE_STYLE
Jefferson,Thomas
對(duì)toString()方法而言最重要的是什么?一是準(zhǔn)確,二是要緊緊跟上不斷變化的系統(tǒng)內(nèi)容.任何實(shí)用的錯(cuò)誤信息里都帶有顯示出錯(cuò)
對(duì)象內(nèi)容的文本信息.出現(xiàn)異常時(shí),只要打印出對(duì)象的值,往往就能很容易知道是什么地方引起異常.在缺日志系統(tǒng)的情況下,離開調(diào)試
器就幾乎無法調(diào)試程序,尤其是在診斷一個(gè)只影響很少人的罕見問題,而這個(gè)問題只有在特定場(chǎng)景下執(zhí)行特定的操作才會(huì)碰到.這時(shí),
最好能知道和錯(cuò)誤相關(guān)的每個(gè)對(duì)象的內(nèi)部狀態(tài),而toString()方法是顯示這些信息的最簡(jiǎn)便辦法.自動(dòng)生成toString()方法會(huì)使你的
錯(cuò)誤提示信息更有意義.
- package test2;
-
- import org.apache.commons.lang.builder.ToStringBuilder;
- import org.apache.commons.lang.builder.ToStringStyle;
-
- /**
- * 用Commons Lang組件實(shí)現(xiàn)自定義toString()方法
- * @author fhd001
- */
- public class ToStringTest2 {
-
- public static void main(String[] args) {
-
- Student1 stu1 = new Student1();
- stu1.setAddress("湖北");
- stu1.setName("李小龍");
- stu1.setAge(60);
-
- System.out.println(stu1.toString());
- }
- }
-
- class Student1{
-
- private String name;
- private int age;
- private String address;
-
- public void setName(String name) {
- this.name = name;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- public String getAddress() {
- return address;
- }
-
- @Override
- public String toString() {
-
- /*
- * 這里用ToStringBuilder,ToStringStyle類重寫toString()方法
- */
- return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
- .append("name",name).append("address",address).toString();
- }
- }
package test2;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* 用Commons Lang組件實(shí)現(xiàn)自定義toString()方法
* @author fhd001
*/
public class ToStringTest2 {
public static void main(String[] args) {
Student1 stu1 = new Student1();
stu1.setAddress("湖北");
stu1.setName("李小龍");
stu1.setAge(60);
System.out.println(stu1.toString());
}
}
class Student1{
private String name;
private int age;
private String address;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getAddress() {
return address;
}
@Override
public String toString() {
/*
* 這里用ToStringBuilder,ToStringStyle類重寫toString()方法
*/
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("name",name).append("address",address).toString();
}
}
結(jié)果代碼
test2.Student1@a62fc3[
name=李小龍
address=湖北
]
轉(zhuǎn)載于http://www.tkk7.com/xcp/admin/EditPosts.aspx?opt=1
名稱: ?4C.ESL | .↗Evon
口號(hào): 遇到新問題?先要尋找一個(gè)方案乄而不是創(chuàng)造一個(gè)方案こ
mail: 聯(lián)系我