2010-10-15 71 views
28

我們有很多對象,我們想要實現一個簡單的toString來輸出對象的屬性。其中一些屬性本身可能是複雜的對象。什麼是toString實現的最佳標準樣式?

是否有任何標準,或僅僅是一種風格的最佳做法?我想是這樣的:

[SimpleClassName] { prop1:value, prop2:value } 

在這種情況下,嵌套值將如下所示:

[SimpleClassName] { prop1:value, prop2:[NestedObject] { prop3:value}} 

我們使用Java,但我發現自己問的大多數語言同樣的問題!

+3

提示:像Eclipse這樣的IDE可以生成'toString()'。探索* Source *菜單。省時間! – BalusC 2010-10-16 02:15:10

+0

我認爲一個真正的時間將是使用調試器。您可以隨時中斷執行,然後打印出您需要的關於可用對象的所有信息,獲取堆棧軌跡,進行所需的更改,然後繼續。所有這些都不會使用toString方法和痕跡膨脹你的代碼。爲什麼麻煩,那麼調試器會爲你做所有事情,爲了每一個對象? – Joony 2010-10-16 07:39:29

回答

20

就我個人而言,我發現[]和{}的組合不容易立即查看層次結構。

我喜歡這種格式(我已經看到它在許多地方被使用):

SimpleClassName[prop1=value, prop2=value] 
SimpleClassName[prop1=value, prop2=NestedObject[prop3=value]] 

還有與@添加標識的可能性,例如the default stylecommons-langToStringBuilder做這(使用它自己的例子):

[email protected][name=John Doe,age=33,smoker=false] 
+0

的日子裏表現不佳,但是我想知道它是如何與各種框架和其他開源項目所使用的toString相互聯繫的? – Nicole 2010-10-15 22:58:30

+0

+1,很高興知道eclipse默認會以這種格式生成'toString'方法。 – 2014-09-11 06:30:42

+0

我喜歡這個,儘管我喜歡的一個變體就像Java教程,它們不會在逗號後面加空格。雖然它更密集,但它具有能夠看到字符串而無需添加引號的優勢,如果這是有道理的。 Class.getSimpleName()很有用,而不是硬編碼,因爲基於數組的變量是Arrays.toString()。 – 2016-05-17 14:16:24

4

JSON語法似乎符合得很好,因爲它是專門設計來代表複雜的對象作爲字符串

Person = { 
    "firstName": "John", 
    "lastName": "Smith", 
    "age": 25, 
    "address": 
    { 
     "streetAddress": "21 2nd Street", 
     "city": "New York", 
     "state": "NY", 
     "postalCode": "10021" 
    }, 
    "phoneNumber": 
    [ 
     { 
      "type": "home", 
      "number": "212 555-1234" 
     }, 
     { 
      "type": "fax", 
      "number": "646 555-4567" 
     } 
    ] 
} 
+9

我覺得'toString'應該真的是要返回一行,所以像json這樣的東西可能會過於冗長。 – zigdon 2010-10-15 22:35:18

+0

@zigdon - 沒有理由不能將它壓縮成一行 – 2010-10-15 22:58:30

+0

沒錯,但對於大型嵌套對象,它仍然相當冗長。 – zigdon 2010-10-15 23:06:00

0

如果你的對象有一些可能是有用的標識,我想實現像你的第二個例如:

[SimpleClassName:id] { prop1:value, prop2:[NestedObject:id] { prop3:value }} 

id是任何有意義的該對象是一個標識符 - 爲對規範Person對象的名稱,用於從數據庫中的對象的主密鑰等

0

既然你問什麼其他的開源項目,下面是jEdit的是怎麼做的,這是類似的Wouter的:

BufferChanging[what=BUFFER_CHANGING,source=org.gjt.sp.jedit.EditPane[active,global]] 
0

檢出phps print_r($ obj,true) 或serialize()也可以正常工作,不知道需要什麼。 jsons也是一個乾淨的解決方案,特別是如果u要導入的JavaScript environbments

數據
25

我認爲GuavaMoreObjects.toStringHelper()產生的格式是相當不錯的,但它主要是剛剛好有你使用一些一致的格式:

public String toString() { 
    return Objects.toStringHelper(this) 
     .add("prop1", prop1) 
     .add("prop2", prop2) 
     .toString(); 
} 

// Produces "SimpleClassName{prop1=foo, prop2=bar}" 
2

有沒有標準,或簡單地只是一種風格的最佳做法?

編號toString()方法的「最佳」輸出取決於您要使用它的方式。它是否在序列化對象狀態的形式允許它被反序列化?它是否用於創建調試消息?是否要將對象呈現給最終用戶?

如果您想爲調試/日誌記錄toString()方法開發內部樣式,那很好。但除非有這個要求,否則我不打擾。國際海事組織,這是可以更好地花在別處的努力。

1

沒有直接回答這個問題,但是下面將初始開發過程中節省時間:

免責聲明:Apache的共享庫使用。

  1. Java > Editor > Templates中添加一個新的Eclipse模板,名爲xreflect;下面添加到其模式 textarea的:

// ----------模板啓動----------- // $ {:進口(ORG .apache.commons.lang.builder.EqualsBuilder,org.apache.commons.lang.builder.HashCodeBuilder,org.apache.commons.lang.builder.ReflectionToStringBuilder)} /* *(非Javadoc) * java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals( final Object pObj){ return EqualsBuilder.reflectionEquals(this,pObj); }

/* 
* (non-Javadoc) 
* @see java.lang.Object#toString() 
*/ 
@Override 
public String toString() { 
    return ReflectionToStringBuilder.toString(this); 
} 

/* 
* (non-Javadoc) 
* @see java.lang.Object#hashCode() 
*/ 
@Override 
public int hashCode() { 
    return HashCodeBuilder.reflectionHashCode(this); 
} 
// ---------- template end ----------- // 
  • OKOK
  • 只要到一個Java類,類型xreflect的端部,並按下Ctrl鍵 + 空間自動填充等於( ),toString()和hashCode()方法。
  • +1

    不知何故,代碼模板無法正確粘貼在這裏....要複製它,請按下帖子下方的「編輯」並複製。 – KrishPrabakar 2016-01-07 08:36:35

    相關問題