7

これは、コーディング スタイルと推奨される方法に関する質問です。

質問への回答で説明したように、コンストラクターに super() を配置する必要はありませんか? スーパークラスのデフォルト (引数なし) コンストラクターを使用するクラスのコンストラクターを作成する場合は、コンストラクsuper()ターの先頭で次のように呼び出すことができます。

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

ただし、呼び出しを省略することもできます。どちらの場合でも、コンパイラは super() 呼び出しがあったかのように動作します。

それでは、呼び出しをコンストラクターに入れますか?

一方では、 を含めるsuper()と物事がより明確になると主張する人もいるかもしれません。OTOH、私はいつも冗長なコードを書くのが嫌いなので、個人的には省略しがちです。ただし、他の人のコードで定期的に見ています。

あなたの経験は何ですか?どちらかのアプローチで問題がありましたか? 1 つのアプローチを規定するコーディング ガイドラインはありますか?

ところで:関連する質問(参考までに):

他のコンストラクターがない場合に、既定のコンストラクターを明示的にコーディングする理由はありますか?

4

9 に答える 9

20

super()不要なキャストを記述しないのと同じ理由で、呼び出しを記述しません。

追加情報を提供せずにコードにノイズを追加します (コンパイラにコードを読む開発者にも)。

于 2010-04-26T11:28:12.583 に答える
4

私はしませんが、大学在学中にこれを行うことについて私に与えられた議論は、それにより物事がより明確になり、スーパークラスコンストラクターが呼び出されていることを「忘れる」ことがないというものでした。

必要性がわかりません。

于 2010-04-26T11:26:45.160 に答える
4

一部の IDE の一部のバージョンのデフォルト設定では、これが自動的に生成されるため、これが表示される理由の 1 つです。

書くか書かないかは、誰が読むかによる。私はそれを追加したくありませんが、チーム メンバーがコンパイラの機能やオブジェクトの構築方法を理解しているかどうか確信が持てない場合は、「念のため」追加してもかまいません。

于 2010-04-26T11:25:47.967 に答える
2

あなたの経験は何ですか?どちらかのアプローチで問題がありましたか?

デフォルトのコンストラクター(明示的)を呼び出したことがなく、問題に直面したこともありません

于 2010-04-26T11:27:11.883 に答える
2

super()コンストラクターがパラメーターを必要とする場合にのみ使用しsuper()ます。

于 2010-04-26T11:33:21.043 に答える
1

私はそれを決して追加しませんでした。同僚がスーパークラスへの暗黙の呼び出しが行われたことを理解していなかったとき、私は非常にショックを受けました。

于 2010-04-26T11:28:21.477 に答える
1

利点:あなたのコードを読む人は誰でも、あなたが本当にデフォルトのコンストラクターを呼び出したいと思っていることを知っています。誤って呼び出しを省略していません。

欠点:重要でない情報でコードが乱雑になります。

通常、ある言語で命令を省略できる場合、そうすることは悪いスタイルではありません。メリットとデメリットを天秤にかける問題だと思います。たとえばsuper()、コンストラクターにパラメーターがあり、基本クラスにもパラメーター化されたコンストラクターが利用できる場合は、明示的に記述することをお勧めします。

于 2010-04-26T11:44:14.480 に答える
0

私は継承よりも構成を好むので、super() の呼び出しが必要なコードを書かないようにしています。

別のクラスから派生する必要がある場合は、両方を独自のインターフェイスの背後に置き、そのうちの 1 つを依存関係として別のクラスに渡します。

ただし、余分な依存関係を与えることができない lib クラスがある場合、最初に試みることはデコレータを使用することです。

これが機能せず、実装から派生する必要がある場合は、書くかどうかは問題ではないと思います。これはsuper()めったに起こらないためです;)

というわけで、この質問は無意味だと思います。

于 2010-04-26T12:43:32.737 に答える
0

私は実際にsuper()呼び出しを入れました. 数か月前にコードを書き、そのコードに戻るとsuper()、コンストラクターを見ているときに、自分が書いたクラスが何かから継承されていることを思い出します。

于 2010-04-26T11:32:47.380 に答える