私は抽象クラスChildClass
から継承していますが、実装するコンストラクタは4つあります。
すべてのコンストラクタに共通の一般的な設定があります。
これらのタスクを抽象化して、すべてのコンストラクタで呼び出すことができます。
オブジェクトがすべてのコンストラクタシグネチャで呼び出されるのではなく、初期化されるときに特定のメソッドを呼び出す方法はありますか?オブジェクトの初期化時にメソッドを呼び出す
答えて
すでにコメントに記載されているように、共通の初期化コードを呼び出す方法の1つはthis(...)
の使用で、つまり別のコンストラクタから1つのコンストラクタを呼び出します。ただし、この呼び出しはコンストラクタの最初の文でなければならないため、必要なものを提供しない可能性があります。
また、すべてのコンストラクタで適切な場所(コンストラクタの末尾など)に初期化メソッド(最も一般的な名前はinit()
)を呼び出すことができます。ただし、サブクラスがそのメソッドをオーバーライドすると、スーパーコンストラクターがメソッドを呼び出す未定義の状況が発生する可能性があり、サブクラスの未初期化フィールドを使用します。メソッドをオーバーライドできないように、つまり最終的に宣言するかプライベートにするかを緩和する必要があります(これは明示的なので最終的ですが)。
第三のオプションがありますあなたのニーズに応じて:初期化子ブロックを使用します。
class Super {
{
//this is the initializer block that is called before the corresponding constructors
//are called so it might or might not fit your needs
}
}
ここでは、すべての3つのオプションを組み合わせた例です:
static class Super {
{
//called before any of the Super constructors
System.out.println("Super initializer");
}
private final void init() {
System.out.println("Super init method");
}
public Super() {
System.out.println("Super common constructor");
}
public Super(String name) {
this(); //needs to be the first statement if used
System.out.println("Super name constructor");
init(); //can be called anywhere
}
}
static class Sub extends Super {
{
//called before any of the Sub constructors
System.out.println("Sub initializer");
}
private final void init() {
System.out.println("Sub init method");
}
public Sub() {
System.out.println("Sub common constructor");
}
public Sub(String name) {
super(name); //needs to be the first statement if used, calls the corrsponding Super constructor
System.out.println("Sub name constructor");
init(); //can be called anywhere
}
}
あなたが今new Sub("some name")
を呼び出した場合、あなたが買ってあげます次の出力:
Super initializer
Super common constructor
Super name constructor
Super init method
Sub initializer
Sub name constructor
Sub init method
Javaコンパイラは、基底クラスのコンストラクタへの呼び出しを確認する必要がありますので、あなたは、抽象基底クラスのコンストラクタに共通のコードを配置することができます:
abstract class BaseClass {
protected BaseClass(/*put arguments here*/) {
// Code that is common to all child classes
}
}
class ChildClassOne extends BaseClass {
public ChildClassOne(/*put arguments here*/) {
super(arg1, arg2, ...);
// More code here
}
}
あなたはクラスのインスタンスメソッドを宣言することができます
Class A{
public A(){
initialize();
}
public void initialize(){
//code goes here
}
}
このコンセプトは抽象クラスにも適用されます。
コンストラクタをチェーンすることができます。
public class Test {
public Test() {
// Common initialisations.
}
public Test(String stuff) {
// Call the one^
this();
// Something else.
}
次に、共通コードを()
コンストラクタに入れることができます。
代わりにInitializer block。
Class A {
{
// initialize your instance here...
}
// rest of the class...
}
コンパイラは、いずれかのコンストラクタの前にイニシャライザコードが呼び出されていることを確認します。
しかし、これを使うのはちょっと躊躇します。おそらく他の選択肢がない(基底クラスにコードを置くなど)場合にのみ使用してください。
共通のコードを1つのコンストラクタに入れて、他のコンストラクタの最初の命令としてを呼び出すことができる場合は、Javaの慣用方法です。
ユースケースが複雑な場合は、コンシューマから特定のメソッドを呼び出すことができます。ただし、プライベート、ファイナル、またはスタティックの場合は(可)ユースケースの例は次のようになります。
class Test {
private final void init(int i, String str) {
// do common initialization
}
public Test(int i) {
String str;
// do complex operations to compute str
init(i, str); // this() would not be allowed here, because not 1st statement
}
public Test(int i, String str) {
init(i, str);
}
}
共通のメソッドを作成し、それをインスタンス変数に割り当てます。それを行う別の方法。
import java.util.List;
public class Test {
int i = commonMethod(1);
Test() {
System.out.println("Inside default constructor");
}
Test(int i) {
System.out.println("Inside argument Constructor ");
}
public int commonMethod(int i) {
System.out.println("Inside commonMethod");
return i;
}
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test(2);
}
}
- 1. オブジェクトを初期化するときにメソッドを呼び出す
- 2. onCheckedChangedシステム初期化時に呼び出されるメソッド
- 3. Java Springの初期化、起動時のメソッドの呼び出し
- 4. ベースコンストラクタの呼び出し時に初期化メソッドを再利用する
- 5. AzManオブジェクトの初期化メソッドを呼び出すと、FileNotFoundExceptionが発生します。
- 6. Visual Studioパッケージデバッグ時に初期化メソッドが呼び出されない
- 7. JavaFX8 FXMLコントローラの初期化メソッドが呼び出されない
- 8. wcfクライアントの初期化とメソッド呼び出し
- 9. は、クラスメソッドの呼び出し初期化
- 10. Objective Cサブクラスの初期化メソッドがスーパークラスのinitializeメソッドを呼び出す方法
- 11. 角2ダッシュボードアプリケーションのWeb初期化時のAPI呼び出し
- 12. 初期化時の角2呼び出しAPI
- 13. CodedUI testsエラー呼び出しJenkinsを実行中にテストクラスの初期化メソッドを呼び出す
- 14. webpackロードモジュールをグローバルに呼び出して初期化関数を呼び出す
- 15. Autofac:コンポーネントを登録するときに初期化メソッドを呼び出す
- 16. iOS - Swiftでクラスを初期化せずにメソッドを呼び出す方法
- 17. jQueryモバイルエラー "初期化の前にlistviewのメソッドを呼び出せません"
- 18. rubyで初期化した直後にメソッドを呼び出す方法は?
- 19. Vue.js:コンポーネントの初期化時にウォッチャー関数を呼び出す方法
- 20. JQuery、Googleマップ:「初期化の前にgmapでメソッドを呼び出せません」
- 21. 他のオブジェクトからメソッドを呼び出すメソッド呼び出し
- 22. jQuery ThickBox:初期化メソッドを呼び出すときの複数のタイトルバー
- 23. コントローラを呼び出す前にAngularJsアプリケーションを初期化する
- 24. Springとjavaで初期化されたEnvironmentオブジェクトの後にメソッドを呼び出す方法は?
- 25. ベクトル初期化でオブジェクトのデフォルト以外のコンストラクタを呼び出す
- 26. Pythonでクラスを初期化せずにクラスメソッドを呼び出す
- 27. GridSearchCVはオブジェクトの初期化子をパイプラインで呼び出しますか?
- 28. 最初のメソッドの呼び出し時に2番目のメソッドへの呼び出しをトリガーする
- 29. 誰がクラス初期化メソッド<clinit>を呼び出し、いつですか?
- 30. GenericUDFの初期化メソッドが複数回呼び出されています
outオブジェクトがインスタンスメソッドを作成してコンストラクタを使用すると、 ''これを使用して中央コンストラクタに委任する – ravthiru
どれ可能性(...)を呼び出すことはできません?、オブジェクトを作成することができますかそれ以外にも、メソッドがオーバーライドされた場合、問題が発生する可能性があります。オーバーライドされたメソッドがスーパーコンストラクタによって呼び出されたが、まだ初期化されていないサブクラスのフィールドを使用する場合 – Thomas
トーマスが示唆していることは、これを行う最も一般的な方法です(可能な場合)。たとえば、オプションがオプションの場合、デフォルト値でコンストラクタに委譲します。 –