【问题标题】:Java - Private member vs default member of a private inner classJava - 私有内部类的私有成员与默认成员
【发布时间】:2017-12-22 18:45:57
【问题描述】:

既然封闭类可以访问其内部类的私有字段,那么对于私有内部类,何时应将它们声明为私有、默认或公共?

【问题讨论】:

标签: java inner-classes access-modifiers


【解决方案1】:

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

同一个包com.exercise.test中有2个类,其中的类是OtherClassSampleClassWithInner,其中包含内部类InnerClass

OtherClass 中声明为私有的 InnerClass 的成员不可访问。在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);

    }
} 

【讨论】:

  • 该操作询问如果内部类已经有一个私有修饰符,私有修饰符将添加到您的代码中有何用途。当然,如果内部类是公共的,那么是的,但是如果内部类具有私有修饰符,那么 var1 和 var2 就没有使用修饰符
【解决方案2】:

乍一看,在内部类的成员上指定访问修饰符似乎无关紧要。正如您所指出的,包含类无论如何都可以访问所有成员。

这里有一些额外的注意事项:

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

【讨论】:

    【解决方案3】:

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

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

    private 内部类的特殊情况下,所有内容仅对您的包含类可见。那就是内部类成员的可见性并不重要。另一个极端,如果你正在开发一个库,通常的做法是只将接口公开为契约。完全隐藏实施细节。

    【讨论】:

      猜你喜欢
      • 2014-06-03
      • 2020-09-04
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2011-08-23
      相关资源
      最近更新 更多