2010-04-26 69 views
6

這是一個關於編碼風格的問題和建議的做法:您是否將super()調用作爲構造函數的開始?

正如在回答這個問題unnecessary to put super() in constructor?解釋,如果你寫的是應該使用默認的(無參數)從構造函數的類的構造函數父類,你可以在你的構造函數的調用開始super()

public MyClass(int parm){ 
    super(); // leaving this out makes no difference 
    // do stuff... 
} 

,但你也可以省略通話;在兩種情況下,編譯器都會像超級()調用那樣執行。

那麼,你是否把你的構造函數調用或不?

一方面,有人可能會爭辯說,包括super()使事情更加明確。 OTOH,我總是不喜歡寫冗餘的代碼,所以我個人傾向於把它留下來;然而,我經常從別人的代碼中看到它。

你有什麼經驗?您是否遇到過這種或那種方法的問題?你有編碼準則,規定了一種方法?

BTW:一個相關的問題(僅供參考):

Is there a reason to explicitly code a default constructor when there are no other constructors?

+0

我不這樣做,但可能是因爲我讀的所有代碼(以及從中學到的)都沒有。我可以簡單地延續我學到的不良風格。 – 2010-04-26 11:27:58

回答

20

我不寫super()呼叫出於同樣的原因,我不寫不必要的強制轉換:

它增加了噪聲代碼沒有提供任何額外的信息(既不是編譯器也不是給開發者閱讀我的代碼)。

+3

+1「避免噪音」。代碼很難讀取...... – sleske 2010-04-26 11:52:41

4

有些IDE的某些版本的缺省設置自動生成的,所以這是一個原因,你可能會看到它。

是否寫信取決於誰會讀取它。我不想添加它,但如果您不確定團隊成員是否理解編譯器的作用,以及對象構造是如何進行的,則可以添加它以「以防萬一」。

+7

如果你不確定團隊成員瞭解編譯器做什麼,那麼你有更嚴重的問題... – sleske 2010-04-26 11:52:00

+1

true :)(15chrs) – Bozho 2010-04-26 12:00:01

4

我不這樣認爲,但是在大學期間這樣做的理由是它讓事情變得更加明確,所以你不會「忘記」超類構造函數被調用。

我只是沒有看到需要壽。

2

您有什麼經驗?您是否 與其中一個或另一個 方法有問題?

我從來沒有所謂的默認構造函數(明確的),從來沒有遇到任何問題

+0

-1你可能做了......暗含 – Tomas 2010-04-26 11:41:08

+0

@Tomas - 當然是,固定它現在快樂嗎? – stacker 2010-04-26 11:45:13

1

我從來沒有加過它,當一位同事不明白有超級類的暗示調用,所以我應該開始做這件事時,我深感震驚。

+8

或者,也許你應該開始教育你的同事,而不是;-) – 2010-04-26 11:33:17

0

我真的把super()調用,因爲我覺得它是一個有用的記憶助手。當我幾個月前寫了一段代碼並返回時,super()提醒我,當我查看構造函數時,我寫的類繼承了某些東西。

+4

是不是說它在課程開始時「擴展」的事實足夠了;-)? – sleske 2010-04-26 11:51:25

+0

這將是如果構造函數和類定義可以在同一時間查看,並非總是如此。我通常把我所有的屬性放在我的方法之前。 – 2010-04-26 13:22:23

1

僅當構造函數super()需要參數時才使用super()

+3

當然,但這是一個完全不同的情況:如果你需要傳遞參數,你必須顯式調用super(parms),所以它不再是編碼風格的問題...... – sleske 2010-04-26 11:47:38

1

優點:任何讀你的代碼的人都知道你真的想調用默認的構造函數,你沒有把錯誤留下。

缺點:你用不重要的信息混淆了你的代碼。

通常,如果一種語言讓你省略某些指令,那麼這樣做可不錯。我認爲這是一個權衡利弊的問題。例如,當你的構造函數有參數並且基類也有參數化的構造函數時,明確地寫super()可能是一個好主意。

0

我儘量避免編寫需要調用super()的代碼,因爲我比起繼承更喜歡構圖。

如果我必須從另一個類派生,我試圖把兩者都放在一個自己的接口之後,並將其中的一個作爲依賴項傳遞給另一個接口。

但是,如果我有一個lib類,我不能給一個額外的依賴項,我嘗試的第一件事就是使用裝飾器。

如果這也不行,我有從執行的派生,我覺得也無所謂是否寫入super()與否,因爲它發生如此罕見;)

所以,這一切的一切,我認爲這個問題是毫無意義的。

相關問題