Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问内部类中的字段的建议/正确方法是什么?_Java_Inner Classes - Fatal编程技术网

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:)