【问题标题】:Anonymous class instantiation with definition - overwrite protected method具有定义的匿名类实例化 - 覆盖受保护的方法
【发布时间】:2023-03-27 05:54:01
【问题描述】:

假设我有课:

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;
        }
    }

我尝试使用Calling newly defined method from anonymous class,但它不允许我实例化 A 类。我也不想使用反射。

我不想定义嵌套类只是为了覆盖一个属性。问题的根源是 Spring-integration ImapMailReceiver,我想在其中覆盖任务调度程序。如下:

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

【问题讨论】:

    标签: java nested abstract protected anonymous


    【解决方案1】:

    您的new A() { ... } 仍然只是定义一个新类。因此,您不能简单地将任何语句放在大括号之间,只有字段、方法和嵌套类型声明可以放在那里,但构造函数是 not 允许的。您可以添加一个实例初始化器:

    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
      }
      

      【讨论】:

        猜你喜欢
        • 2015-10-01
        • 2013-07-01
        • 2022-07-08
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多