簡體   English   中英

在 Java 中將方法調用鏈接到構造函數是一個好習慣嗎?

[英]Is chaining method calls to constructors a good practice in Java?

我一直認為我必須初始化一個類,然后才能調用它的非靜態方法,但是,我遇到了一個解決方案,其中包含這樣的方法:

public String someStringMethod(){
    return new MyClass().toString();
}

所以我可能是開發新手,但這是一個好的做法嗎? 與“經典”(見下文)方式相比,這是一種更好的調用方法的方式嗎?

public String classicStringMethod(){
    MyClass cl = new MyClass();
    return cl.toString();
}

它們有什么性能差異嗎? 第一種方式有“特殊名稱”嗎?

無顯着差異

正如評論所解釋的,這兩種方法在語義上是相同的; 兩種方式都能達到完全相同的結果,選擇實際上只是風格上的差異。

第二種方法將新對象分配給引用變量。 第一種方法跳過了引用變量的使用。 但在這兩種情況下,類都被用作實例化對象的定義,然后在該對象上調用toString方法。

在語義上,first (chained/fluent) 語法通常會通知您創建的對象將僅用於單個操作鏈,然后被丟棄。 由於沒有顯式引用導出,它還表明對象的生命范圍僅限於該語句。 第二個(顯式)暗示該對象是/曾經/將用於其他操作,無論是另一個方法調用,設置一個字段,返回它,甚至只是調試。 盡管如此, 使用(或不使用)臨時輔助變量的一般概念只是一種風格

請記住,變量不是對象。 例如, Dog hershey = new Dog( "Australian Shepard" , "red", "Hershey" ); 使用兩塊內存。 一個塊是新對象,保存品種、顏色和名稱的狀態數據。 在另一個單獨的塊中是引用變量hershey持有一個指向 Dog 對象的內存塊的內存位置的指針。 引用變量讓我們稍后引用對象。

Java 語法使這種從引用變量到對象的跳轉如此無縫,以至於我們通常將hershey視為Dog對象“Hershey”,但實際上它們是獨立且不同的。

至於性能,任何差異都無關緊要。 實際上,編譯器或 JVM 很可能會將第二種方法的兩行合並為第一種方法的單行。 我不確定,我也不在乎。 你也不應該。 我們的工作是編寫清晰易讀的代碼。 編譯器和 JVM 的工作是可靠、高效和快速地運行該代碼。 嘗試微優化已多次被證明是徒勞的(甚至適得其反),因為 JVM 實現是極其復雜的軟件工程部分,經過高度調整以進行此類優化。 您可以通過編寫簡單直接的代碼而不是“聰明”來最好地幫助編譯器和 JVM。

請注意,第二種方法可以使調試更容易,因為您的調試器可以通過引用變量訪問對象來檢查實例化的對象,並且因為您可以在該特定構造函數調用上顯式設置行斷點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM