我有一个类MyClass
和一个内部类MyNestedClass
,如下所示:
public class MyClass {
...
public class MyNestedClass {
...
}
}
两节课都很长。正因为如此,我想在不破坏层次结构的情况下,将它们分为两个不同的文件。这是因为使用MyClass的程序员不应该看到嵌套类。
有办法做到这一点吗?
您可以将内部类包设为私有包,这意味着只能从完全相同的包中的其他类访问它。对于标准JDK包(如java.lang
或java.util
)中的隐藏类,也经常这样做。
在pkg/MyClass.java 中
public class MyClass {
...
}
在pkg/MyHiddenClass.java 中
class MyHiddenClass {
final MyClass outer;
MyHiddenClass( MyClass outer )
{
this.outer = outer;
}
...
}
现在,当您想要访问外部类的方法或变量时,您需要在它们前面加上outer.
,但当编译器综合创建对外部实例的引用时,您可以获得与以前基本相同的功能。
否。Java源代码不能跨多个文件进行拆分。您需要一个类似于C#中的分部类的构造,而Java没有这种构造。
我认为你有一个god对象或类似的东西,请考虑重构你的代码
http://en.wikipedia.org/wiki/God_object
内部类的对象保留对paren类对象的隐式引用。如果嵌套的类不是static
(它是内部的),则不能。但是,如果嵌套类不需要直接访问父类的类实例,也不需要访问私有字段,则可以进行重构,将内部类移出,并执行而不是声明它为public(不能访问该包之外的)。
是,使用级联跳线。级联跳线是一个抽象的、非静态的内部类,在其他任何地方都有定义。
MyClass.java
public class MyClass {
public abstract class CascadeJumper {}
}
MyNestedClass
private class MyNestedClass extends MyClass.CascadeJumper {
MyNestedClass(MyClass dollarOne) {
dollarOne.super(); // yes, is possible!
}
}
问候
您可以创建在两者中都进行扩展的抽象基类。
然而,如果这些类很大,那么您最好重新评估类设计,看看是否可以重构为分别代表一个关注点的类。