【问题标题】:What is the recommended/correct way to access fields in an inner class?访问内部类中的字段的推荐/正确方法是什么?
【发布时间】:2015-05-12 19:56:04
【问题描述】:

假设我们有这个类及其内部类:

/* 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()访问,对吧?

【问题讨论】:

  • java 访问规则很复杂(protected 更是如此)。但如果它有效,你应该很高兴,为什么要抱怨:)

标签: java inner-classes


【解决方案1】:

由于foo是私有的,所以只能通过getFoo()访问,对吧?

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

6.6.1 说:

[如果] 成员或构造函数声明为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;
    }}
}

是否使用吸气剂实际上是一个品味问题。这里的重要实现是外部类可以访问其嵌套类的私有成员。

作为建议,我个人会说:

  • 如果嵌套类是private(只有外部类可以访问它),我什至不会费心给它一个getter,除非getter 进行计算。这是任意的,其他人可以选择不使用它。如果样式混杂,则代码有模糊性。 (inner.fooinner.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);
}

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

原来是specifically defined

static 关键字可以修改非内部类或接口 T 的主体内的成员类型 C 的声明。 它的作用是声明C不是一个内部类。

【讨论】:

  • 更迂腐,“静态,成员,类” :) 嵌套类包括更多,如本地类和匿名类;虽然确实只有成员类可以是静态的
  • @bayou.io 是的,如果我们要具体一点的话。由于本地类和匿名类始终是内部类,所有静态嵌套类都是成员类。
  • 有趣的是,我不明白Bar 在顶级类的主体中,但它可以工作。 (并且 Eclipse 不知道它,因为它抱怨未使用私有 i。)。我想“内部”可以用不同的方式来理解:)
  • @eckes 是的,这是一个奇怪的例子。 “类体”是一个grammatical construct,它可以包含其他类体。
  • 是的,它可以包含它,但在这种情况下,我希望“在顶级类的主体内并嵌套所有类”(或类似的)。 “只在里面”是meh :)
【解决方案2】:

这完全取决于您要从哪里访问该对象的代码。由于它是一个静态嵌套类,因此您将能够从任何一种方式访问​​您的对象。请参阅此链接http://www.javatpoint.com/static-nested-class 以更好地了解内部类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多