ホーム>source

クラスがあると仮定しましょう:

class A {
    protected int x; // no public getter, setter
}

ここで、クラスAを拡張して、「x」変数を上書きします。答えは次のとおりです。

public class SomeClass {
    someMethod() {
        A extendedClass = new MyExtension(5);
    }
    class MyExtension extends A {
        public MyExtension(int x) {
            super.x = x;
        }
    }
}

そして私の質問:ネストされたクラスを個別に定義せずにそれを行う可能性はありますか?私はこのようなことを意味します

   someMethod() {
        A extendedClass = new A() {
            // here do something like super.x = 5;
        }
    }

試した匿名クラスから新しく定義されたメソッドを呼び出す ただし、Aクラスをインスタンス化することはできません。また、反射を使用したくない。

1つのプロパティを上書きするためだけに、ネストされたクラスを定義したくはありません。問題の原因は、タスクスケジューラを上書きするSpring統合ImapMailReceiverです。以下のように:

   final ImapMailReceiver imapMailReceiver = new ImapMailReceiver() {
           super.setTaskScheduler(MYTASKSCHEDULERHERE);
    }

あなたの答え
  • 解決した方法 # 1

    あなたの new A() { ... }  まだ新しいクラスを定義しているだけです。したがって、単に中括弧の間に文を置くことはできません。フィールド、メソッド、ネストされた型の宣言のみがそこに行くことができますが、コンストラクタはじゃない 許可された。代わりにインスタンス初期化子を追加できます:

    A extendedClass = new A() {
      {
        x = 5;
      }
    }
    
    

  • 解決した方法 # 2

    ネストされたまたは匿名の内部クラスを使用する理由 以下のように、オーバーライドを行い、オーバーライドされた変数にアクセスできます。

    public class SomeClass extends A{
        int val;
        void someMethod(int val) {
            super.x = val;
        }
        public static void main(String[] args) {
            SomeClass sc = new SomeClass();
            System.out.println(sc.x);  // output=10
            sc.someMethod(20);
            System.out.println(sc.x);  // output=20
        }
    }
    class A {
        protected int x = 10; // no public getter, setter
    }
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ sql - HAVINGでMAX()とCOUNT()を使用する