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不是内部类.