2017-07-18 217 views
2

由于封闭类可以访问其内部类的私有字段,何时应该将私有内部类声明为private,default或public?Java - 私有成员vs私有内部类的默认成员

+0

内部类也可以通过不封闭它的其他类使用。 – Henry

+1

也许:https://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members?rq=1 – 2017-07-18 04:59:32

+1

内部类是公共还是私人? – ajb

回答

0

除非有理由使用包私有或公开可见性,否则将所有内容声明为私有是一种很好的风格。而这个原因不应该是这样更方便

所有不是私人的可能会在您的课程外部使用,因此更改为您的代码的任何非私人方面可能会破坏其他代码位置或甚至依赖于您的代码的外部代码。让重构变得更困难或有时甚至是不可能的,并改变你的类的内部工作。

私人内部类的特殊情况下,所有内容都只对您的包含类可见。这是内部班级成员的知名度并不重要。另一个极端,如果你正在研究一个图书馆的常见做法,只将接口公开为契约。保持实施细节完全隐藏。

1

乍一看,在内部类的成员上指定访问修饰符似乎并不重要。正如你所指出的那样,包含类可以访问所有成员。

这里有一些额外的考虑,但:

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

不仅外部类而且其他类可以访问内部类和它的成员。所以当你想让内部类成员只能通过外部类访问时,你可以声明它们是私有的。考虑休耕例如

有2班在同一个包com.exercise.test和类在它被OtherClassSampleClassWithInner包含内部类的声明为private InnerClassInnerClass

成员不在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); 

    } 
}