私有内部类的构造函数也是私有的吗?

时间:2016-01-08 14:07:33

标签: java android android-studio inner-classes android-lint

我正在重构一个正在变大的android项目。运行lint为我提供了 JSME问题 外部和内部类之间的私有成员访问。考虑以下示例

public class Outer {
    private Inner mInner = new Inner();

    private class Inner {}
}

我收到了信息

Name
   private field Inner mInner

Location
   class Outer (default package)

Problem synopsis
   Access to private member of class 'Inner' at line 2

Problem resolution
   Make 'Inner' constructor package-local

应用问题解决方案会将源更改为

public class Outer {
    private Inner mInner = new Inner();

    private class Inner {
        Inner() {}
    }
}

此刻我有点困惑。到目前为止,我认为这个例子等同于

public class Outer {
    private Inner mInner = new Inner();

    private class Inner {
        public Inner() {}
    }
}

在这种情况下我错了还是皮棉问题?

2 个答案:

答案 0 :(得分:2)

Section 8.8.9 of the Java language specification, "Default constructor"说:

  

在类类型中,如果该类声明为public,则为默认值   构造函数隐式赋予访问修饰符public(§6.6);如果   该类被声明为protected,然后是默认构造函数   隐式赋予访问修饰符保护(第6.6节);如果是这样的话   声明为private,然后隐式给出默认构造函数   access modifier private(§6.6);否则,默认构造函数具有   无访问修饰符隐含的默认访问权限。

答案 1 :(得分:1)

你的理解是错的,但是短信并不是特别清楚,这个建议可能与Android无关(不是J2ME)。

正如David解释的那样,内部类的隐式默认构造函数具有与类本身相同的访问修饰符,但私有成员可在同一编译单元(Java文件)中访问。没有语言理由可以避免使用私有构造函数。

但是,在内部,由于类被编译为单独的输出文件,因此编译器必须创建合成适配器方法以提供对私有成员的类访问。这些方法的运行时缺点与桌面应用程序无关,但对于像J2ME这样狭窄的东西,可以通过直接访问成员(使用包范围)来消除差异。

Android对类文件执行重要的后处理,Android设备几乎不像J2ME设备那样受限制。除非您编写代码来定位两个平台,否则我将更改lint配置。