デフォルトのフィールド初期化に依存-プログラミングスタイルが悪いですか?[閉まっている]


20

オラクルの公式ドキュメントへのリンクが与えられました:https : //docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

それが言われるところ:

デフォルト値

フィールドが宣言されている場合、必ずしも値を割り当てる必要はありません。宣言されているが初期化されていないフィールドは、コンパイラによって適切なデフォルトに設定されます。一般的に言って、このデフォルトは、データ型に応じてゼロまたはnullになります。ただし、このようなデフォルト値に依存することは、一般に悪いプログラミングスタイルと見なされます。

この部分を強調したい:

ただし、このようなデフォルト値に依存することは、一般に悪いプログラミングスタイルと見なされます。

しかし、まあ、これは、インスタンス変数にデフォルト値があることを知っている言語仕様の基本的な部分です。Java SEライブラリのソースコードでも広く使用されているのに、なぜこれがプログラミング悪い習慣なのでしょうか。


5
ええと。その声明がそこにあるとは知りませんでした。私は実際にそれらに頼ることは良い習慣だと思います。 private int count = 0;何もしないコードであり、何もしないコードは乱雑です。これは、java.langからクラスをインポートする、またはでクラスを宣言するようなものextends Objectです。
VGR

2
...またはpublic abstractインターフェースにメソッドを持っています。
マンピッツ

1
パブリックアブストラクトの何が問題になっていますか?
John Keates、

1
パズルのピースはC ++から来るかもしれません。これは一般的な言語であり、デフォルトの初期化とゼロの初期化の処理は、バグの継続的な原因です。C ++では、最も例外的なケースを除いて、デフォルトに依存するのはまっすぐな悪い考えです。それは文化的にJavaに漏れているかもしれません。
Cort Ammon

@JohnKeates-私のJavaは少し錆びていprivateますが、インターフェース内のメソッドは意味をなさず、abstract暗示されています。
スコットスミス

回答:


6

引用テキストは次のとおりです。

「しかしながら、そのようなデフォルト値に依存することは、一般的に悪いプログラミングスタイルと考えられています。」

皮肉なことに、「それは一般的に考えられている」とは、多くの場合、著者が提示されている声明の信頼できる情報源を見つけようとしたことがないという言い方です。

この場合、主張は明らかに疑わしいものです。証拠:サンプリングされた5つのうち5つのJavaスタイルガイドは、デフォルト値に依存すべきか、依存すべきかについて何も述べていません。

(私のサンプリング方法は、「Javaスタイルガイド」の最初の5つの異なるGoogle検索ヒットを確認することでした。次に、各ドキュメントで「デフォルト」を検索しました。これは完全な分析ではありませんが、それは私の主張に役立ちます。 )


OK。それは本当にJavaコードの読みやすさを助けますか?

これは議論の余地があります。

一方では、デフォルトの初期化について学習していない初心者のJavaプログラマーは、ゼロまたはヌルがどこから来ているのかについて困惑するかもしれません。しかし、明示的な初期化を探して、それがない場合は、チュートリアルまたは本を読んでデフォルトの初期化について調べるのに十分なはずです。(ご希望です!)

一方、Javaプログラマーが本番用のコードベースを維持することは通常ありません。経験豊富なJavaプログラマーにとって、冗長な初期化は読みやすさを改善しません。(せいぜい)ノイズです。

私の考えでは、フィールドの冗長な初期化によって達成される唯一のことは、初期値について考えたことをコードの将来の読者に知らせることです。(@GhostCatが表現したように、デフォルトの初期化は意図を伝えません。)

しかし、逆に私がその読者だったとしても、コード作成者の考えを必ずしも信用することはできません。したがって、この「シグナル」の価値にも疑問があります。


信頼性はどうですか?

Javaでは違いはありません。JLS 、フィールドに対してデフォルトの初期化行われることを指定しています。逆に、ローカル変数の場合、明確に初期化されていない変数を使用しようとすると、コンパイルエラーになります。

つまり、明示的に初期化されていない変数の実行時の動作は完全に予測可能です。

変数が初期化されない可能性があるCやC ++のような言語とは対照的に、動作は指定されておらず、クラッシュを引き起こし、異なるプラットフォームでの動作の違いを引き起こす可能性があります。常に明示的に変数を初期化する場合の方がはるかに強力です。


パフォーマンスはどうですか?

違いはありません。JITコンパイラは、冗長な初期化とデフォルトの初期化を同じように処理できる必要があります。


19

シンプル:デフォルト値に依存しても意図は伝わりません。

本当にそのフィールドを0から始めたいのですか、それとも値を割り当てるのを忘れましたか?!

そしてもちろん、null参照は、nullpointer例外に遭遇するために必要な2つのことの半分です。

最後に、デフォルトを使用することは、非最終フィールドがあることを意味します。可能な限り回避します。

唯一の反論は次のとおりです:なぜあなたがする必要がないものを書き留めますか?しかし、私はリストされた欠点をトランペットで表現していると思います。したがって、フィールドに0を明示的に割り当てる方が、コンパイラーに任せるよりはましです。


3
つまり、re:コミュニケーションの意図を伝えない-「管理者のマニー」があなたのコードを見ていて、特定のデータ型のデフォルトがわからない場合はどうでしょうか。彼はそれが本当にNULLである場合に0であると想定し、===チェック(またはvalue&typeの同等の等価チェックがjavaのequals()?)のバグ全体です。何時間もの検索(経験の浅いプログラマーにとって)は、とても単純なものの結果である可能性があります。PSは悪魔の支持者を演じようとしています。私は(デフォルトではありませんが)一日中デフォルトを使用し、コードを保守するために賢い人(または少なくとも細部にもっと注意を払う人)を雇うと言います。
TCooper、

@TCooperは、メンテナがJavaについてほとんど知らない場合、実際のJavaコードに触れるビジネスはありません。しかし、私は根本的な概念に同意します。それは初心者にとって物事を難しくします。
GhostCatはモニカCに敬意を表します。

12

なぜこれが悪いプログラミング習慣なのか

アイデアは、デフォルト値に依存している場合、故意にデフォルト値のままにしておくか、単に割り当てるのを忘れただけで、コードを読んでいる人にはすぐにわかりません

... Java SEライブラリのソースコードでも広く使用されている場合

Javaのソースコードは、実際のコーディングの例として信頼できるものではありません。このようなルールに違反しているケースは数多くあります(場合によっては、マイナーなパフォーマンス向上のために意図的に、場合によっては誤って、または長年にわたって受け入れられたスタイルが変更されたため)。


2
私はそれに同意しませんが、これはおそらく正しいです。
VGR

3
@VGRデフォルト値に依存することは最適ではないという主張に同意する傾向があるのと同じくらい、その理由から中立的な方法でそれを表現するように注意しました。コードの品質は主観的なものであり、これは決して普遍的に保持されている見解ではありません。
Michael Berry、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.