我正在重构一个正在变大的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() {}
}
}
在这种情况下我错了还是皮棉问题?
答案 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配置。