[解決済み】インスタンス変数のインスタンス化は宣言時に行うべきか、コンストラクタで行うべきか?
2022-04-01 15:51:51
質問
どちらのアプローチにも利点がありますか?
例1:
class A {
B b = new B();
}
例2:
class A {
B b;
A() {
b = new B();
}
}
解決方法は?
- インスタンス変数の初期化は、実際にはコンパイラによってコンストラクタに入れられるので、差はありません。
- 最初のバリエーションはより読みやすい。
- 最初のバリエーションでは例外処理を行うことができません。
-
さらに、コンパイラによってコンストラクタに入れられる初期化ブロックがあります。
{ a = new A(); }
チェック サンの説明とアドバイス
から このチュートリアル :
しかし、フィールド宣言はどのメソッドにも属さないので、ステートメントのように実行することはできません。その代わり、Javaコンパイラはインスタンス・フィールドの初期化コードを自動的に生成し、それをクラスのコンストラクタに配置します。初期化コードはソースコードに現れる順番にコンストラクタに挿入されます。つまり、フィールド初期化子はそれ以前に宣言されたフィールドの初期値を使用することができます。
さらに、次のような場合もあります。 遅延初期化 フィールドを作成します。フィールドの初期化が高価な操作である場合、必要なときにすぐに初期化することができます。
ExpensiveObject o;
public ExpensiveObject getExpensiveObject() {
if (o == null) {
o = new ExpensiveObject();
}
return o;
}
そして、最終的には(Billさんの指摘通り)依存関係の管理のためには
避ける
を使用することで
new
演算子は、クラス内のどの場所でも使用できます。代わりに
依存性注入
つまり、他の誰か(他のクラスやフレームワーク)があなたのクラスのインスタンスを作成し、依存性を注入するようにすることが望ましいのです。
関連
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0
-
[解決済み] 環境変数JAVA_OPTSの使い方を教えてください。
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] Oracle DB : java.sql.SQLException: 閉じた接続
-
[解決済み] プロトコルハンドラの初期化に失敗しました。
-
[解決済み] ファイルを作成せずに、ファイルが存在するかどうかをチェックする
-
[解決済み] Apache Camelのログに簡単なテキストを記録する
-
[解決済み] javaでAnnotation Inheritanceのようなものはあるのでしょうか?
-
[解決済み】変数の初期化はコンストラクタ内とコンストラクタ外、どちらで行うべきか【重複