我正在重构一个越来越大的android项目。 运行棉绒使我在外部和内部类之间都能获得JSME问题的私有成员访问权限。 考虑以下示例
public class Outer {
private Inner mInner = new Inner();
private class Inner {}
}
我知道了
Name
privatefieldInnermInner
Location
classOuter (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() {}
}
}
我在这种情况下错了吗?还是皮棉问题?
当类被声明为包私有时,是否应该声明一个公共构造函数?
每当您将某个类声明为私有时,属于该类的所有内容都将变为私有
@ cricket_007可悲的是没有。 它不包括皮棉抱怨的部分。
那我不太明白这个问题。 因为类本身是private,所以具有public构造函数与程序包级别(无访问修饰符)的构造函数并不重要。 例如。 Outer之外的任何类都不能访问Outer.Inner。 皮棉消息似乎是在说,没有比private约束少的构造函数,您不能说new Inner()
看看这个答案。 stackoverflow.com/a/15287730/2308683
您的理解是错误的,但是关于linter的问题还不是特别清楚,并且该建议可能与Android(不是J2ME)无关。
正如David解释的那样,内部类的隐式默认构造函数具有与类本身相同的访问修饰符,但是私有成员可以在同一编译单元(Java文件)中访问。没有语言上的理由来避免使用私有构造函数。
但是,在内部,由于将类编译为单独的输出文件,因此编译器必须创建合成适配器方法,以提供对私有成员的类访问权限。这些方法的运行时缺点与台式机应用程序无关,但是对于局限在J2ME上的东西,可以通过直接访问成员(使用程序包作用域)来消除这种差异。
Android对类文件执行大量的后处理,Android设备的约束程度不如J2ME设备。除非您要针对这两个平台编写代码,否则我将更改lint配置。
Java语言规范的第8.8.9节"默认构造函数"说:
In a class type, if the class is declared public, then the default
constructor is implicitly given the access modifier public (§6.6); if
the class is declared protected, then the default constructor is
implicitly given the access modifier protected (§6.6); if the class is
declared private, then the default constructor is implicitly given the
access modifier private (§6.6); otherwise, the default constructor has
the default access implied by no access modifier.