recommended/correct 访问内部 class 字段的方法是什么?

What is the recommended/correct way to access fields in an inner class?

假设我们有这个 class 和它的内部 class:

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

我很惊讶 inner.foo 有效。

因为fooprivate,通过getFoo()只能访问,对吧?

Since foo is private, it can be accessed only through getFoo(), right?

在这种情况下,Outer 也可以访问它,因为 InnerOuter 的成员。

6.6.1 说:

[If] the member or constructor is declared private, [then] access is permitted if and only if it occurs within the body of the top level class that encloses the declaration of the member or constructor.

请注意,它被指定为可在包含声明的 顶层 class 的正文中访问。

这意味着,例如:

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

是否使用 getter 真的是个人喜好问题。这里的重要认识是外部 classes 可以访问其嵌套 classes.

的私有成员

作为推荐,我个人会说:

  • 如果嵌套 class 是 private(只有外部 class 可以访问它),我什至不会费心给它 getter 除非getter 进行计算。它是任意的,其他人可以选择不使用它。如果风格混杂,代码就有模糊性。 (inner.fooinner.getFoo() 真的做同样的事情吗?我们必须浪费时间检查 Inner class 才能找到答案。)
  • 但是如果您喜欢这种风格,您还是可以完成 getter。
  • 如果嵌套的 class 不是 private,请使用 getter 以便样式统一。

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

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

作为迂腐的说明,您的 static class Inner {} 在技术上是 静态嵌套 class,而不是 内部 class class Inner {}(没有 static)将是一个内部 class.

这是specifically defined是这样的:

The static keyword may modify the declaration of a member type C within the body of a non-inner class or interface T. Its effect is to declare that C is not an inner class.

这完全取决于您要从何处访问该对象的代码段。由于它是静态嵌套的 class,因此您可以通过任何一种方式访问​​您的对象。请参阅此 link http://www.javatpoint.com/static-nested-class 以更好地理解内部 classes。