[解決済み] コンストラクタでsuper()の前に計算を行うことは可能ですか?
2023-05-22 07:28:52
質問
TextBoxオブジェクトを引数とする単一引数コンストラクタを持つクラスBaseがあるとします。私は次のフォームのクラスSimpleを持っている場合。
public class Simple extends Base {
public Simple(){
TextBox t = new TextBox();
super(t);
//wouldn't it be nice if I could do things with t down here?
}
}
superの呼び出しはコンストラクタの最初の呼び出しでなければならないというエラーが表示されます。しかし、奇妙なことに、私はこれを行うことができます。
public class Simple extends Base {
public Simple(){
super(new TextBox());
}
}
なぜ、これは許可されているのに、最初の例は許可されていないのでしょうか?サブクラスを最初にセットアップする必要があることは理解できますし、スーパーコンストラクタが呼び出される前にオブジェクト変数をインスタンス化することを許可しないかもしれません。しかし、tは明らかにメソッド(ローカル)変数であり、なぜそれを許可しないのでしょうか?
この制限を回避する方法はありますか?super を呼び出す前に構築し、コンストラクタを入力した後に構築する可能性があるものに変数を保持する良い安全な方法はありますか? あるいは、より一般的には、スーパーが実際に呼び出される前に、しかしコンストラクタ内で計算を行うことを可能にするのでしょうか?
ありがとうございます。
どのように解決するのですか?
はい、この単純なケースに対する回避策があります。プライベートなコンストラクタを作成し、そのコンストラクタに
TextBox
を引数として取るプライベート コンストラクタを作成し、パブリック コンストラクタからそれを呼び出すことができます。
public class Simple extends Base {
private Simple(TextBox t) {
super(t);
// continue doing stuff with t here
}
public Simple() {
this(new TextBox());
}
}
より複雑なものについては、ファクトリーや静的ファクトリーメソッドを使用する必要があります。
関連
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
シェルコマンドやスクリプトのJavaコール
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] instanceofを呼び出す前にnullチェックは必要ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
Javaでよくある構文エラー
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
セミコロン期待値エラー解決
-
Java基礎編 - オブジェクト指向
-
アクセス制限の解決方法: ---- in Java
-
ApiModel と @ApiModelProperty の使用法
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
[解決済み】Javaでコンストラクタは例外を投げることができますか?