private inner class 的构造函数也是私有的吗?
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() {}
}
}
在这种情况下我错了吗还是 lint 的问题?
Section 8.8.9 of the Java language specification, "Default constructor" 说:
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.
您的理解有误,但 linter 不是特别清楚,建议可能与 Android(不是 J2ME)无关。
正如 David 解释的那样,内部 class 的隐式默认构造函数具有与 class 本身相同的访问修饰符,但是私有成员可以在同一编译单元中访问(Java 文件)。没有语言理由避免使用私有构造函数。
然而,在内部,由于 classes 被编译成单独的输出文件,编译器必须创建合成适配器方法来提供 classes 对私有成员的访问。这些方法的运行时缺点与桌面应用程序无关,但对于像 J2ME 这样局促的东西,可能值得通过使成员可直接访问(使用包范围)来消除差异。
Android 在 class 文件上执行重要的 post-processing,并且 Android 设备不像 J2ME 设备那样受到限制。除非您正在编写针对这两个平台的代码,否则我会更改 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() {}
}
}
在这种情况下我错了吗还是 lint 的问题?
Section 8.8.9 of the Java language specification, "Default constructor" 说:
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.
您的理解有误,但 linter 不是特别清楚,建议可能与 Android(不是 J2ME)无关。
正如 David 解释的那样,内部 class 的隐式默认构造函数具有与 class 本身相同的访问修饰符,但是私有成员可以在同一编译单元中访问(Java 文件)。没有语言理由避免使用私有构造函数。
然而,在内部,由于 classes 被编译成单独的输出文件,编译器必须创建合成适配器方法来提供 classes 对私有成员的访问。这些方法的运行时缺点与桌面应用程序无关,但对于像 J2ME 这样局促的东西,可能值得通过使成员可直接访问(使用包范围)来消除差异。
Android 在 class 文件上执行重要的 post-processing,并且 Android 设备不像 J2ME 设备那样受到限制。除非您正在编写针对这两个平台的代码,否则我会更改 lint 配置。