繁体   English   中英

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

[英]Is constructor of private inner class also private?

我正在重构一个正在变大的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() {}
    }
}

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

Java语言规范的第8.8.9节“默认构造函数”说:

在类类型中,如果类被声明为public,则默认构造函数被隐式赋予访问修饰符public(§6.6); 如果该类被声明为protected,则默认构造函数被隐式赋予访问修饰符protected(§6.6); 如果该类被声明为private,则默认构造函数被隐式赋予访问修饰符private(§6.6); 否则,默认构造函数具有无访问修饰符隐含的默认访问权限。

你的理解是错的,但是linter并不是特别清楚,而且建议可能与Android(不是J2ME)无关。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM