Java 访问内部类中的字段的建议/正确方法是什么?
假设我们有这个类及其内部类:Java 访问内部类中的字段的建议/正确方法是什么?,java,inner-classes,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
/* 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;
}
我很惊讶internal.foo
能工作
由于foo
是private
,因此只能通过getFoo()
访问,对吗
因为foo
是私有的,所以只能通过getFoo()
访问它,对吗
在这种情况下,Outer
也可以访问它,因为internal
是Outer
的成员
说:
[如果]成员或构造函数声明为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;
}}
}
是否使用吸气剂实际上是一个品味的问题。这里重要的实现是外部类可以访问其嵌套类的私有成员
作为建议,我个人会说:
- 如果嵌套类是私有的(只有外部类可以访问它),我甚至不会给它一个getter,除非getter进行计算。它是任意的,其他人可以选择不使用它。如果样式是混合的,则代码具有模糊性。(
和internal.foo
真的做了同样的事情吗?我们必须花时间检查internal.getFoo()
类才能找到答案。)internal
- 但如果你喜欢这种风格的话,你还是可以通过一个getter
- 如果嵌套类不是私有的,则使用getter使样式统一
私有
成员,即使是对外部类,也可以将工厂与本地或匿名类一起使用:
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);
}
作为一个迂腐的注释,您的
staticclassInner{}
在技术上是一个静态嵌套类,而不是一个内部类classInner{}
(没有静态
)将是一个内部类
这就是:
static
关键字可以修改非内部类或接口T
主体内成员类型C
的声明其作用是声明C
不是内部类。
这完全取决于您希望从何处访问该对象的代码。因为它是一个静态嵌套类,所以您可以通过任何一种方式访问对象。请参阅此链接以更好地了解内部类。java访问规则非常复杂(受保护的
更是如此)。但如果它有效,您应该很高兴,为什么要抱怨:)更迂腐地说,“静态、成员、类”:)嵌套类包含更多,如本地类和非类;虽然只有成员类可以static@bayou.io是的,如果我们说得具体点的话。由于本地类和匿名类总是内部的,所以所有静态嵌套类都是成员类。有趣的是,我不知道Bar
在顶级类的主体中,但它可以工作。(Eclipse不知道,因为它抱怨没有使用私有i
)。我想“内在”可以用不同的方式理解:)@eckes是的,这是一个奇怪的例子。“类主体”是一个类主体,它可以包含其他类主体。是的,它可以包含它,但在这种情况下,我希望“在顶级类主体内并嵌套所有类”(或类似)。“仅在”是meh:)