引用テキストは次のとおりです。
「しかしながら、そのようなデフォルト値に依存することは、一般的に悪いプログラミングスタイルと考えられています。」
皮肉なことに、「それは一般的に考えられている」とは、多くの場合、著者が提示されている声明の信頼できる情報源を見つけようとしたことがないという言い方です。
この場合、主張は明らかに疑わしいものです。証拠:サンプリングされた5つのうち5つのJavaスタイルガイドは、デフォルト値に依存すべきか、依存すべきかについて何も述べていません。
(私のサンプリング方法は、「Javaスタイルガイド」の最初の5つの異なるGoogle検索ヒットを確認することでした。次に、各ドキュメントで「デフォルト」を検索しました。これは完全な分析ではありませんが、それは私の主張に役立ちます。 )
OK。それは本当にJavaコードの読みやすさを助けますか?
これは議論の余地があります。
一方では、デフォルトの初期化について学習していない初心者のJavaプログラマーは、ゼロまたはヌルがどこから来ているのかについて困惑するかもしれません。しかし、明示的な初期化を探して、それがない場合は、チュートリアルまたは本を読んでデフォルトの初期化について調べるのに十分なはずです。(ご希望です!)
一方、Javaプログラマーが本番用のコードベースを維持することは通常ありません。経験豊富なJavaプログラマーにとって、冗長な初期化は読みやすさを改善しません。(せいぜい)ノイズです。
私の考えでは、フィールドの冗長な初期化によって達成される唯一のことは、初期値について考えたことをコードの将来の読者に知らせることです。(@GhostCatが表現したように、デフォルトの初期化は意図を伝えません。)
しかし、逆に私がその読者だったとしても、コード作成者の考えを必ずしも信用することはできません。したがって、この「シグナル」の価値にも疑問があります。
信頼性はどうですか?
Javaでは違いはありません。JLS は、フィールドに対してデフォルトの初期化が行われることを指定しています。逆に、ローカル変数の場合、明確に初期化されていない変数を使用しようとすると、コンパイルエラーになります。
つまり、明示的に初期化されていない変数の実行時の動作は完全に予測可能です。
変数が初期化されない可能性があるCやC ++のような言語とは対照的に、動作は指定されておらず、クラッシュを引き起こし、異なるプラットフォームでの動作の違いを引き起こす可能性があります。常に明示的に変数を初期化する場合の方がはるかに強力です。
パフォーマンスはどうですか?
違いはありません。JITコンパイラは、冗長な初期化とデフォルトの初期化を同じように処理できる必要があります。
private int count = 0;
何もしないコードであり、何もしないコードは乱雑です。これは、java.langからクラスをインポートする、またはでクラスを宣言するようなものextends Object
です。