【问题标题】:Is there any sense in access modifiers for fields of the private inner class?私有内部类的字段的访问修饰符有什么意义吗?
【发布时间】:2014-10-02 00:39:57
【问题描述】:

假设我有一个外部类,里面有一个内部类。内部类有四个字段,其中包含所有可能的访问修饰符。

class Outer {
    private class Inner {
        public int publicField;
        protected int protectedField;
        int packagePrivatefield;
        private int privateField;
    }

    void doSomethingWithFields() {
        Inner inner = new Inner();
        inner.publicField = 111;
        inner.protectedField = 111;
        inner.packagePrivatefield = 111;
        inner.privateField = 111;
    }
}

内部类是私有的,所以我不能在外部类之外创建它的实例。在外部类内部,如果我创建内部类的一个实例并尝试更改每个字段的值,我将成功地做到这一点。所以我看到上述字段的访问修饰符没有意义。有吗?

编辑:主要问题是: 我应该为私有内部类的成员选择哪些访问修饰符? 内部类不仅可以实现接口。我可以把一些有逻辑的复杂结构放进去。

【问题讨论】:

  • 我倾向于使用相同的修饰符,就好像我的类不是私有内部类一样。这至少记录了不应从外部调用此方法,而应从外部调用此方法。它还有助于将类重构为顶级类。
  • 很抱歉,assylias 的重复是无效的:这个问题专门针对 fields,而标记为重复的问题涉及 methods,而他们的推理完全不同。

标签: java


【解决方案1】:

访问修饰符在继承中有发言权。另一个扩展你所说的类的内部私有类没有外部类的权限。

public class Main {
    private class Test {
        protected int hello;
    }
    private class TestNext extends Test {
        private TestNext() {
            this.hello = 1;
        }
    }
}

会编译,但如果 hello 是私有的,则不会。

【讨论】:

  • 我要在这里补充一点,如果您重构代码以提取类,使用修饰符(并使用 getter 和 setter 代替字段)会更安全。
  • @JohnB 绝对是,但考虑到这个问题,我认为没有任何理由提及这一点。我没有评论他的班级名称,或任何类似的。只是举一个例子,私有内部类中的访问修饰符很重要。
【解决方案2】:

对,如果内部类是私有的,那就没有意义了。

但请记住,内部类通常不是很漂亮,您应该将多个类与包组合在一起。

【讨论】:

  • 内部类非常方便,因为它们可以作为监听器并且可以访问外部类。
【解决方案3】:

是的。你是对的。但仅当您有单个嵌套内部时,在私有内部类中拥有各种访问修饰符没有什么不同。课堂外什么都看不到。 但是,如果您有另一个嵌套的内部类,那么您的访问修饰符将很重要。 例如

class A{
   private class B{
      class C{}
   }
}

在这种情况下,B 类的字段和方法访问修饰符很重要

【讨论】:

    【解决方案4】:

    如果内部类没有实现任何接口或继承,则没有必要指定访问修饰符。

    如果内部类继承了某些东西,那么在这种情况下确实有意义。

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 2018-08-15
      • 2015-11-26
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多