我有一个类MyClass
和一个内部类MyNestedClass
,就像这样:
public class MyClass {
...
public class MyNestedClass {
...
}
}
这两个类非常长。因此,我想将它们分成两个不同的文件,而不破坏层次结构。这是因为嵌套类不应该对使用 MyClass 的程序员可见。
有办法实现吗?
我有一个类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.
但实际上,当编译器合成外部实例的引用时,你会得到与之前基本相同的功能。
MyClass
的私有属性无法从MyHiddenClass
中访问,而MyHiddenClass
是受保护的,而不是私有的。 - SparK不可以将Java源代码分割成多个文件。你需要类似于C#中的部分类的结构,而Java没有这样的功能。
内部类的对象会隐式地引用父类对象。
如果嵌套类不是static
(它是内部类),则无法这样做。但是,如果嵌套类不需要直接访问父类实例并且不需要访问私有字段,则应该可以进行重构,将内部类移出并且不要声明为public(不能在该包之外访问)。
是的,可以使用级联跳转器(cascade-jumper)。级联跳转器是在其他地方定义的抽象和非静态内部类。
MyClass.java
public class MyClass {
public abstract class CascadeJumper {}
}
我的嵌套类
private class MyNestedClass extends MyClass.CascadeJumper {
MyNestedClass(MyClass dollarOne) {
dollarOne.super(); // yes, is possible!
}
}
敬礼
MyNestedClass
,你仍然只能访问MyClass
的公共方法和字段,就像从任何其他类一样。 - AlphaaaMyNestedClass
访问 MyClass
中的私有字段、私有枚举、私有类和私有方法、私有构造函数,简而言之,所有东西都可以访问!试试看吧! - Grim你可以创建抽象基类,然后在两个类中进行扩展。
但是,如果这些类很大,最好重新评估你的类设计,并查看是否可以重构为每个表示一个关注点的类。