访问内部类中的字段的建议/正确方法是什么?

Jef*_*iao 9 java inner-classes

假设我们有这个类及其内部类:

/* Outer.java */
public class Outer {
    private static class Inner {
        private final Object foo;

        public Inner(Object foo) {
            this.foo = foo;
        }

        public Object getFoo() {
            return foo;
        }
    }

    Inner inner = parse(/* someMistery */);

    // Question: to access foo, which is recommended?
    Object bar = inner.getFoo();
    Object baz = inner.foo;
}
Run Code Online (Sandbox Code Playgroud)

我觉得很有意思inner.foo.

由于fooIS private,它可以访问只能通过getFoo(),对不对?

Rad*_*def 11

既然foo是私人的,它只能通过访问getFoo()权限,对吧?

在这种情况下,Outer也可以访问它,因为它Inner是一个成员Outer.

6.6.1说:

[If]声明成员或构造函数private,当且仅当它发生包含成员或构造函数声明的顶级类的主体内时才允许访问.

请注意,它被指定为可以在包含声明的顶级类的主体内访问.

这意味着,例如:

class Outer {
    static class Foo {
        private Foo() {}
        private int i;
    }
    static class Bar {{
        // Bar has access to Foo's
        // private members too
        new Foo().i = 2;
    }}
}
Run Code Online (Sandbox Code Playgroud)

是否使用吸气剂确实是一种品味问题.这里的重要实现是外部类可以访问其嵌套类的私有成员.

作为推荐,我个人会说:

  • 如果嵌套类是private(只有外部类可以访问它),除非getter进行计算,否则我甚至不打算给它一个getter.它是任意的,其他人可以出现并选择不使用它.如果样式混合,则代码具有模糊性.(做inner.foo并且inner.getFoo()真的做同样的事情吗?我们不得不浪费时间检查Inner课程以找出答案.)
  • 但是,如果这是你喜欢的风格,你可以通过一个吸气剂.
  • 如果没有嵌套类private,请使用getter,以使样式统一.

如果你真的想要隐藏private成员,甚至是外部类,你可以使用具有本地或匿名类的工厂:

interface Nested {
    Object getFoo();
}

static Nested newNested(Object foo) {
    // NestedImpl has method scope,
    // so the outer class can't refer to it by name
    // e.g. even to cast to it
    class NestedImpl implements Nested {
        Object foo;

        NestedImpl(Object foo) {
            this.foo = foo;
        }

        @Override
        public Object getFoo() {
            return foo;
        }
    }

    return new NestedImpl(foo);
}
Run Code Online (Sandbox Code Playgroud)

作为一个迂腐的笔记,你static class Inner {}在技​​术上是一个静态嵌套类,而不是内部类.class Inner {}(没有static)将是一个内部阶级.

这是具体限定为这样:

static关键字可能修改成员类型的声明C一个非内部类或接口的主体内T.它的作用是声明它C不是内部类.