![](/img/trans.png)
[英]What is the eclipse shortcut for auto-generating a default and field constructor?
[英]What are the shortcut to Auto-generating toString Method in Eclipse?
為一些簡單的類自動生成toString
方法是好是壞?
我正在考慮生成類似下面的內容,它采用變量名稱並生成一個toString
方法,該方法打印名稱后跟其值。
private String name;
private int age;
private double height;
public String toString(){
return String.format("Name: %s Age: %d Height %f", name, age, height);
}
Eclipse 3.5.2(可能還有更早的版本)已經提供了這個特性。 如果您在編輯器中右鍵單擊,您將在 Source -> Generate toString()... 下找到它。
要回答您關於自動生成toString()
是否是一種不好的做法的問題,我的觀點是它不是。 如果生成的代碼與您自己編寫的代碼非常相似,那為什么還要打字呢?
我個人喜歡為所有對象實現一個 toString 方法,因為它有助於調試。
我會考慮使用 Apache Commons ToStringBuilder 。
您可以使用反射實現一個簡單的 toString 方法,如下所示:
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
使用此方法,如果/何時添加字段,您將不必更新 toString 方法。
添加到史蒂夫和唐的答案(他們+1):
使您的toString()
方法簡單,確保它永遠不會觸發預期(尤其要注意可能為空的字段)。
如果可能,不要調用類的其他方法。 至少,請確保您的toString()
方法不會修改您的對象。
並注意愚蠢的異常 toString 循環:
public class MyClass {
...
public String toString() {
// BAD PRACTICE 1: this can throw NPE - just use field1
return " field1=" + field1.toString()
+ " extraData=" + getExtraData();
// BAD PRACTICE 2: potential exception-toString loop
}
public MyExtraData getExtraData() {
try {
.... do something
} catch(Exception e) {
throw new RuntimeException("error getting extradata - " + this.toString(),e);
}
}
}
添加 toString() 時要明確生成文本的受眾。 一些框架使用 toString() 方法生成最終用戶可見的文本(例如某些 Web 框架),而許多人使用 toString() 方法生成調試/開發人員信息。 無論哪種方式,請確保您在 toString 實現中具有足夠的唯一性以滿足您的要求。
toString() 的默認 JDK 實現會生成開發人員信息,因此如果可能的話,這通常是我推薦的模式,但是如果您正在從事具有不同想法/期望的項目,您可能會感到困惑......
剛剛注意到 -在 NetBeans IDE 中,您可以通過選擇要生成的字段來生成 toString() 方法以進行right click->insert code
或使用快捷方式ALT+INSERT
然后選擇 toString()。
它的樣子是:
@Override
public String toString() {
return "ClassName{"+"fieldName="+fieldName+'}';
}
這是調試的好方法,不需要額外的庫。
考慮到包括@Steve 在內的一些舊答案,我想根據最新的庫添加答案。
添加依賴
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
在你的班級
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
public class User {
...
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
您可以排除某些字段,如下所示
...
@Override
public String toString() {
return ReflectionToStringBuilder.toStringExclude(this, "name"); // Name will be excluded from toString output
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.