Java中的本地内部类

问题描述 投票:-2回答:2

对于下面的代码示例,当我们执行代码时,它将打印:

来自实例方法 来自当地的内部阶级

现在,如果我只想执行本地内部类方法m2()并希望输出为:

来自当地的内部阶级

class A {
    void m1() {
        class B {
            void m2() {
                System.out.println("from local inner class");
            }
        }
        System.out.println("from instance method");
        B b = new B();
        b.m2();
    }

    public static void main(String[] args) {
        A a = new A();
        a.m1();
    }
}

当完全需要本地内部类时,究竟是什么用例,没有它就可能无法实现某些功能。

java inner-classes
2个回答
1
投票

我看不到你在开什么,也许你想从方法的调用中分离出方法的创建,将所有的实现细节隐藏在内部类中?如果是这样怎么样....

首先创建一个接口,以便了解您正在访问的类型(比反射更整洁)

interface X {
    void m2()
}

现在方法m1()返回实现接口的类的实例

class A {
    X m1() {
        class B {
            void m2() {
                System.out.println("from local inner class");
            }
        }
        B b = new B();
        return b;
    }

    public static void main(String[] args) {
        A a = new A();
        // call m1() to get an instance of interface X
        X x = a.m1();
        // invoke method on interface instance
        x.m2()
    }
}

这已经从方法的调用中拆分了方法的创建(包含在类中,想象'functor')。


0
投票

您可以从函数返回本地类类型的对象,并通过反射调用它们上的方法,例如以下作品:

class A {
    Object m1() {
        class B {
            public void m2() {
                System.out.println("from local inner class");
            }
        }
        System.out.println("from instance method");
        B b = new B();
        b.m2();
        return b;
    }

    public static void main(String[] args) {
        try {
            A a = new A();
            Object obj = a.m1();
            obj.getClass().getMethod("m2").invoke(obj);
        } catch (Exception e) {
            System.out.println(e.toString());   
        }   
    }
}

你应该这样做吗?可能不是。

© www.soinside.com 2019 - 2024. All rights reserved.