由于封闭类可以访问其内部类的私有字段,因此它们何时应该为私有内部类声明为private,default或public?
答案 0 :(得分:1)
乍一看,在内部类的成员上指定访问修饰符似乎无关紧要。正如您所指出的,包含类无论如何都可以访问所有成员。
以下是一些其他注意事项:
public
,并作为包含类的接口定义的一部分。也许外部类有一个返回内部类实例的方法。在这种情况下,内部类与成员可见性的顶级类相同。在这种情况下,最好保留实施细节private
。private
可以为将来的维护者记录这些成员不打算由外部类直接访问码。当然,在这一点上,它可能需要将内部类重构为自己的顶级类。public
成员进行操作。例如,Jackson JSON序列化程序默认仅在public
成员上运行。通过添加private
getter等功能,可以使public
成员对其进行操作。这是额外的工作,因此首先声明成员public
可能更方便。答案 1 :(得分:0)
除非有理由使用包私有或公共可见性,否则将所有内容声明为私有都是一种好方式。这个理由不应该是它更方便。
所有非私有的东西都可能在您的类之外使用,因此更改为代码的任何非私有方面可能会破坏其他代码位置甚至依赖于您的代码的外部代码。使重构变得更加困难,有时甚至是不可能的,并改变你班级的内部运作。
在私有内部类的特殊情况下,只有包含的类才能看到所有内容。这就是内部阶级的可见度。成员并不重要。另一方面,如果您正在使用库,那么通常的做法是仅将接口公开为契约。保持实施细节完全隐藏。
答案 2 :(得分:0)
不仅外部类而且其他类都可以访问内部类及其成员。因此,当您希望仅通过其外部类访问内部类成员时,可以将它们声明为私有。考虑下面的例子
同一个包com.exercise.test
中有两个类,其中的类是OtherClass
和SampleClassWithInner
,其中包含内部类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);
}
}