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

4

由于封闭类可以访问其内部类的私有字段,所以对于私有内部类,应该声明为私有、默认或公共?

答案:私有。因为私有内部类只能在封闭类中使用,其他类无法访问它们的私有字段。如果将内部类声明为默认或公共,则可能会导致意外的访问和潜在的安全问题。

内部类也可以被不包含它的其他类使用。 - Henry
1
也许:https://dev59.com/LnI-5IYBdhLWcg3wio9k?rq=1 - user180100
1
内部类是公共的还是私有的? - ajb
1
内部类是私有的。stackoverflow.com/questions/1801718 尝试解释为什么外部类可以访问内部类的私有字段,但没有说明它们的访问修饰符应该是什么。例如,可以看看ArrayList$Sublist。它有3个私有字段和1个默认字段。 - Ravi
3个回答

4
乍一看,似乎在内部类成员上指定访问修饰符是无关紧要的。正如你所指出的,包含类可以访问所有成员。但以下是一些额外的考虑:
  • 有时内部类被声明为public,并作为包含类的接口定义的一部分。也许外部类有一个方法返回内部类的实例。在这种情况下,内部类受到与顶级类相同的成员可见性最佳实践的约束。在这种情况下,最好将实现细节保持为private
  • 尽管编译器不会强制执行,但将内部类成员标记为private可以为未来的维护者记录这些成员不应直接由外部类代码访问。当然,在那时,可能需要将内部类重构为其自己的顶级类。
  • 有时内部类与基于反射的框架结合使用,这些框架仅对public成员进行操作。例如,默认情况下,Jackson JSON序列化程序仅对public成员进行操作。可以通过添加public getter等方式使其操作private成员。这需要额外的工作,因此最好一开始就将成员声明为public
  • 如果上述几点不适用,并且在没有其他要求的情况下,最简单和最短的代码是省略访问修饰符(默认/包私有)。这将是一个项目要考虑的编码风格问题。

0

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

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

在特殊情况下,私有内部类中的所有内容只对包含类可见。也就是说,内部类成员的可见性并不重要。另一方面,如果你正在开发一个库,通常的做法是仅公开接口作为契约,完全隐藏实现细节。


0

不仅外部类,其他类也可以访问内部类及其成员。因此,当您想要使内部类成员仅由其外部类访问时,可以将它们声明为私有的。请考虑以下示例

同一包中有2个类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);

    }
} 

这个问题是在询问如果内部类已经有了private修饰符,那么在你的代码中使用private修饰符会有什么用处。当然,如果内部类是public的话,那就有用了,但是如果内部类已经有了private修饰符,那么对于var1和var2来说,再加上任何修饰符都没有用处。 - StudentAccount4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接