【问题标题】:Understanding the creation of a non static member class in Java as described in Effective Java book了解在 Java 中创建非静态成员类,如 Effective Java 书中所述
【发布时间】:2012-07-19 08:16:48
【问题描述】:

以下来自 Effective Java:

非静态成员类实例与其封闭对象之间的关联 实例在前者创建时建立;它不能被修改 此后。通常,关联是通过调用 实例方法中的非静态成员类构造函数 封闭类。手动建立关联是可能的,尽管很少见 使用表达式 enclosingInstance.new MemberClass(args)。正如你 可以预期,该关联在非静态成员类中占用空间 实例并增加其构建时间。

Bloch 在这里所说的“虽然很少见,但可以使用表达式 enclosureInstance.new MemberClass(args) 手动建立关联。正如您所期望的那样,关联占用了非静态成员类实例中的空间,并且为它的建设增加了时间。” ?

【问题讨论】:

    标签: java effective-java


    【解决方案1】:

    他的意思是你至少可以通过两种方式建立连接。给定

    public class Outer {
        public class Inner {
        }
        void f() {System.out.println(new Inner());}
    }
    Outer x = new Outer();
    

    如果你打电话

    x.f()
    

    那么您打印的值是链接到x 的内部对象。

    但也可以调用:

    x.new Inner();
    

    同时创建一个链接到x 的新内部对象。

    布洛赫说第二种方式很少见。我不知道为什么;我以前用过。

    查看live demo

    class Outer {
        String name;
        public Outer(String name) {
            this.name = name;
        }
    
        public class Inner {
            public String toString() {
                return "I belong to " + Outer.this.name;
            }
        }
    
        void f() {
            System.out.println(new Inner());
        }
    
        void g(Outer a) { 
            System.out.println(a.new Inner());
        }
    }
    
    class Main {
        public static void main(String[] args) {
            Outer x = new Outer("x");
            Outer y = new Outer("y");
            x.f();
            x.g(y);      
        }
    }
    

    输出:

    I belong to x
    I belong to y
    

    【讨论】:

    • 这种情况很少见,因为通常 Inner 实例将在内部 Outer 的某个位置创建,因此使用更简单的语法new Inner() .这种情况更常见的原因是内部类通常强烈绑定到它的内部实例,并且通常对其他对象不感兴趣。
    • @JoachimSauer 即使我们使用第二种方法,那么“内部类将被强绑定到它的内部实例”不是吗?
    • @Geek:我在这里谈论的更多是架构/逻辑视图,而不是纯粹的技术视图。从技术意义上讲,您是绝对正确的:在这两种情况下,生成的对象都无法区分。但从逻辑上看,Outer 类不会“希望”其他类接触(甚至创建Inner 对象。
    • @JoachimSauer 感谢您的澄清..+1。我已经根据您的评论编辑了答案。
    • 我已经大量使用了 Outer.new Inner() 构造来对内部类进行单元测试。在这种情况下,应用程序代码很少需要构造一个非静态的 Inner 类(你需要一个非常好的理由这样做,因为恕我直言,它破坏了 Outer 的封装)。
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 2014-09-17
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多