由于封闭类可以访问其内部类的私有字段,何时应该将私有内部类声明为private,default或public?Java - 私有成员vs私有内部类的默认成员
2
A
回答
0
除非有理由使用包私有或公开可见性,否则将所有内容声明为私有是一种很好的风格。而这个原因不应该是这样更方便。
所有不是私人的可能会在您的课程外部使用,因此更改为您的代码的任何非私人方面可能会破坏其他代码位置或甚至依赖于您的代码的外部代码。让重构变得更困难或有时甚至是不可能的,并改变你的类的内部工作。
在私人内部类的特殊情况下,所有内容都只对您的包含类可见。这是内部班级成员的知名度并不重要。另一个极端,如果你正在研究一个图书馆的常见做法,只将接口公开为契约。保持实施细节完全隐藏。
1
乍一看,在内部类的成员上指定访问修饰符似乎并不重要。正如你所指出的那样,包含类可以访问所有成员。
这里有一些额外的考虑,但:
- 有时内部类被声明
public
并作为包含类的接口定义的一部分。也许外部类有一个返回内部类的实例的方法。在这种情况下,内部类与成员顶级类的成员可见性一样受最佳实践的约束。在这种情况下,最好保留实施细节private
。 - 虽然它不会被编译器强制执行,但将内部类的成员标记为
private
可以为将来的维护者记录这些成员不打算由外部类代码直接访问。当然,在这一点上,它可能需要将内部类重构为它自己的顶级类。 - 有时,内部类与基于反射的框架结合使用,这些框架仅对
public
成员进行操作。例如,Jackson JSON序列化程序默认仅在public
成员上运行。通过添加一个public
吸气剂,可以使其在private
成员上运行。这是额外的工作,所以首先宣布成员public
可能会更方便。 - 如果以上几点不适用,并且没有任何其他要求,最简单和最短的代码是完全省略访问修饰符(默认/包私有)。这将是一个项目需要考虑的编码风格问题。
0
不仅外部类而且其他类可以访问内部类和它的成员。所以当你想让内部类成员只能通过外部类访问时,你可以声明它们是私有的。考虑休耕例如
有2班在同一个包com.exercise.test
和类在它被OtherClass
和SampleClassWithInner
包含内部类的声明为private 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);
}
}
相关问题
- 1. 私有成员
- 2. 静态成员类 - 声明类私有和类成员包私有?
- 3. 访问私有成员的私有成员
- 4. 访问类私有成员内的结构成员?
- 5. 在内部类中访问外部类的私有成员:JRuby
- 6. 类的声明没有私有成员
- 7. 实例初始化VS私有成员
- 8. 更改私有类成员的类
- 9. Java:获取私有成员的注释
- 10. 继承和私有成员
- 11. 访问私有成员C++
- 12. 访问私有成员
- 13. C++私有函数成员
- 14. 对象类型私有类成员
- 15. 从其他类访问私有成员
- 16. 包私有静态成员类与包私有类
- 17. 阅读私有变量的类成员
- 18. 访问私有类中的成员
- 19. 数组作为类的私有成员
- 20. 访问类内部的私有成员指针的假设
- 21. Java中的私人成员
- 22. 公共类,但私有成员变量?
- 23. 子类化与私有成员
- 24. 朋友没有得到私有成员
- 25. 使用类成员函数访问类内的私有结构
- 26. 为什么要在Java中公开私有的内部类成员?
- 27. A类(即类B的成员)如何共享B类的私有成员?
- 28. 初始化结构的私有成员
- 29. fstream的访问为私有成员
- 30. 访问cuda内核中的类的私有成员
内部类也可以通过不封闭它的其他类使用。 – Henry
也许:https://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members?rq=1 – 2017-07-18 04:59:32
内部类是公共还是私人? – ajb