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
有效。
因为foo
是private
,通过getFoo()
只能访问,对吧?
Since foo
is private, it can be accessed only through getFoo()
, right?
在这种情况下,Outer
也可以访问它,因为 Inner
是 Outer
的成员。
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.foo
和 inner.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。
假设我们有这个 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
有效。
因为foo
是private
,通过getFoo()
只能访问,对吧?
Since
foo
is private, it can be accessed only throughgetFoo()
, right?
在这种情况下,Outer
也可以访问它,因为 Inner
是 Outer
的成员。
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.foo
和inner.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 typeC
within the body of a non-inner class or interfaceT
. Its effect is to declare thatC
is not an inner class.
这完全取决于您要从何处访问该对象的代码段。由于它是静态嵌套的 class,因此您可以通过任何一种方式访问您的对象。请参阅此 link http://www.javatpoint.com/static-nested-class 以更好地理解内部 classes。