由于封闭类可以访问其内部类的私有字段,所以对于私有内部类,应该声明为私有、默认或公共?
答案:私有。因为私有内部类只能在封闭类中使用,其他类无法访问它们的私有字段。如果将内部类声明为默认或公共,则可能会导致意外的访问和潜在的安全问题。由于封闭类可以访问其内部类的私有字段,所以对于私有内部类,应该声明为私有、默认或公共?
答案:私有。因为私有内部类只能在封闭类中使用,其他类无法访问它们的私有字段。如果将内部类声明为默认或公共,则可能会导致意外的访问和潜在的安全问题。public
,并作为包含类的接口定义的一部分。也许外部类有一个方法返回内部类的实例。在这种情况下,内部类受到与顶级类相同的成员可见性最佳实践的约束。在这种情况下,最好将实现细节保持为private
。private
可以为未来的维护者记录这些成员不应直接由外部类代码访问。当然,在那时,可能需要将内部类重构为其自己的顶级类。public
成员进行操作。例如,默认情况下,Jackson JSON序列化程序仅对public
成员进行操作。可以通过添加public
getter等方式使其操作private
成员。这需要额外的工作,因此最好一开始就将成员声明为public
。除非有使用包私有或公共可见性的原因,否则声明所有内容为私有是一个好的风格。而这个原因不应该是更方便。
所有不是私有的东西都可以在你的类外部使用,因此对代码的任何非私有方面的更改可能会破坏其他代码位置甚至依赖于你的代码的外部代码。这使得重构和更改类内部工作变得更加困难,有时甚至是不可能的。
在特殊情况下,私有内部类中的所有内容只对包含类可见。也就是说,内部类成员的可见性并不重要。另一方面,如果你正在开发一个库,通常的做法是仅公开接口作为契约,完全隐藏实现细节。
不仅外部类,其他类也可以访问内部类及其成员。因此,当您想要使内部类成员仅由其外部类访问时,可以将它们声明为私有的。请考虑以下示例
同一包中有2个类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);
}
}