我有一个班级MyClass
和一个内部班级MyNestedClass
,如下所示:
public class MyClass {
...
public class MyNestedClass {
...
}
}
这两节课都很长。因此,我想将它们分成两个不同的文件,而不会破坏层次结构。这是因为使用MyClass的程序员不应该看到嵌套类。
有没有办法实现这个目标?
答案 0 :(得分:21)
您可以将内部类包设为私有,这意味着只能从完全相同的包中的其他类访问它。对于java.lang
或java.util
等标准JDK包中的隐藏类,也经常这样做。
public class MyClass {
...
}
pkg / MyHiddenClass.java中的
class MyHiddenClass {
final MyClass outer;
MyHiddenClass( MyClass outer )
{
this.outer = outer;
}
...
}
现在,当您想要访问外部类的方法或变量时,需要使用outer.
作为前缀,但是当编译器通过合成创建对外部实例的引用时,您将获得与之前基本相同的功能。
答案 1 :(得分:6)
没有。 Java源代码不能跨多个文件拆分。你需要一个类似于C#中的部分类的构造,而Java没有。
答案 2 :(得分:5)
inner 类的对象保留对paren类对象的隐式引用。
如果嵌套类不是static
(它是内部的),则不能。但是如果嵌套类不需要直接访问父类的实例并且不需要访问私有字段,那么重构就好了,移出内部类并执行 not 将其声明为public (无法访问该包中的内容)。
答案 3 :(得分:4)
我认为你有一个神对象或类似的东西,请在重构代码中思考
答案 4 :(得分:3)
是的,使用级联跳线。级联跳线是一个抽象的非静态内部类,可以在其他任何地方定义。
MyClass.java
public class MyClass {
public abstract class CascadeJumper {}
}
MyNestedClass
private class MyNestedClass extends MyClass.CascadeJumper {
MyNestedClass(MyClass dollarOne) {
dollarOne.super(); // yes, is possible!
}
}
此致
答案 5 :(得分:1)
您可以创建两个扩展的抽象基类。
但是,如果这些类很大,那么最好重新评估一下您的类设计,看看是否可以重构为代表每个问题的类。