Java - 私有成员与私有内部类的默认成员

时间:2017-07-18 04:41:40

标签: java inner-classes access-modifiers

由于封闭类可以访问其内部类的私有字段,因此它们何时应该为私有内部类声明为private,default或public?

3 个答案:

答案 0 :(得分:1)

乍一看,在内部类的成员上指定访问修饰符似乎无关紧要。正如您所指出的,包含类无论如何都可以访问所有成员。

以下是一些其他注意事项:

  • 有时内部类被声明为public,并作为包含类的接口定义的一部分。也许外部类有一个返回内部类实例的方法。在这种情况下,内部类与成员可见性的顶级类相同。在这种情况下,最好保留实施细节private
  • 虽然它不会被编译器强制执行,但将内部类的成员标记为private可以为将来的维护者记录这些成员不打算由外部类直接访问码。当然,在这一点上,它可能需要将内部类重构为自己的顶级类。
  • 有时内部类与基于反射的框架结合使用,这些框架仅对public成员进行操作。例如,Jackson JSON序列化程序默认仅在public成员上运行。通过添加private getter等功能,可以使public成员对其进行操作。这是额外的工作,因此首先声明成员public可能更方便。
  • 如果以上几点不适用,并且没有任何其他要求,则最简单和最短的代码是完全省略访问修饰符(default / package-private)。这将是项目要考虑的编码风格问题。

答案 1 :(得分:0)

除非有理由使用包私有或公共可见性,否则将所有内容声明为私有都是一种好方式。这个理由不应该是它更方便

所有非私有的东西都可能在您的类之外使用,因此更改为代码的任何非私有方面可能会破坏其他代码位置甚至依赖于您的代码的外部代码。使重构变得更加困难,有时甚至是不可能的,并改变你班级的内部运作。

私有内部类的特殊情况下,只有包含的类才能看到所有内容。这就是内部阶级的可见度。成员并不重要。另一方面,如果您正在使用库,那么通常的做法是仅将接口公开为契约。保持实施细节完全隐藏。

答案 2 :(得分:0)

不仅外部类而且其他类都可以访问内部类及其成员。因此,当您希望仅通过其外部类访问内部类成员时,可以将它们声明为私有。考虑下面的例子

同一个包com.exercise.test中有两个类,其中的类是OtherClassSampleClassWithInner,其中包含内部类InnerClass

InnerClass中无法访问声明为私有的OtherClass成员。在SampleClassWithInner

中可以访问的位置

请参阅此代码以获得更清晰

package com.exercise.test;
//import  com.exercise.test.SampleClassWithInner.InnerClass;

public class OtherClass {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    SampleClassWithInner sampleobj = new SampleClassWithInner();
    SampleClassWithInner.InnerClass innerobj = sampleobj.new InnerClass();

    // innerobj.var1=5; //compile time error
    innerobj.setVar1(5); // ok works
    // System.out.println("value of inner variable declared in other
    // class"+innerobj.var1);// compile time error
    System.out.println("value of inner variable declared in other class " 

+ innerobj.getVar1());
        sampleobj.innerMethodDemo();
    }

}

package com.exercise.test;

public class SampleClassWithInner {

class InnerClass {
    private int var1;
    private int var2;

    public int getVar1() {
        return var1;
    }

    public void setVar1(int var1) {
        this.var1 = var1;
    }

    public int getVar2() {
        return var2;
    }

    public void setVar2(int var2) {
        this.var2 = var2;
    }
}

public void innerMethodDemo() {
    InnerClass obj = new InnerClass();
    obj.var1 = 10;
    System.out.println("this is form the method in outer class " + 

obj.var1);

    }
}