【问题标题】:How to move nested class in superclass in java?如何在java中移动超类中的嵌套类?
【发布时间】:2012-05-29 15:12:36
【问题描述】:

我需要重构类以提取抽象超类。 例如

UpperClass {
NestedClass {
UpperClass.this.someMethod();
}
}

喜欢:

AbstractUpperClass {
    NestedClass {
  ?????.this.someMethod();
  }
}

我计划在UpperClass1 和UpperClass2 2 个类中继承AbstractUpperClass。 但我不知道如何重构这个内部类,因为它调用了封闭类的方法。有可能吗? 谢谢。

【问题讨论】:

  • 当您说“upper”时,您的意思是“super”,还是您正在编写的某种钻禧庆典软件? 8=\/
  • 只需使用 AbstractUpperClass.this.someMethod()
  • 您的代码难以理解。你能提供一个有效的SSCCE吗?

标签: java class nested abstract superclass


【解决方案1】:

这里的诀窍是知道内部类是如何工作的。它本质上只是一个“普通”的静态类,但其构造函数隐式获取对封闭类的引用。所以,这个:

public class TopLevel {

    public void go() {
        new Inner().bar();
    }

    public void foo() { }

    public class Inner {
        public void bar() {
            TopLevel.this.foo();
        }        
    }
}

等价于:

public class TopLevel {

    public void go() {
        new Inner(this).bar();          // explicitly passing in "this"
    }

    public void foo() { }

    public static class Inner {
        private final TopLevel parent;  // note that we have this new field

        public Inner(TopLevel parent) { // note this new constructor
            this.parent = parent;
        }

        public void bar() {             // we use the explicit reference instead
            parent.foo();               // of the implicit TopLevel.this
        }        
    }
}

因此,综上所述,将内部类重构为顶级类的方法是添加一个引用 UpperClass 实例的显式字段,并将此引用传递给 NestedClass 构造函数。换句话说,就像第二个代码 sn-p 而不是第一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多