我有一个类MyClass和一个内部类MyNestedClass,如下所示:
public class MyClass {
...
public class MyNestedClass {
...
}
}
这两节课都很长。 因此,我想将它们分成两个不同的文件,而不会破坏层次结构。 这是因为使用MyClass的程序员不应该看到嵌套类。
有没有办法实现这一目标?
类似的问题stackoverflow.com/questions/2764234/
我有一个类似的问题,并在这里解决了:stackoverflow.com/q/27284667/1190665至少这是我想出的最好的。
您可以将内部类包设为私有,这意味着只能从完全相同的包中的其他类访问它。对于像java.lang或java.util这样的标准JDK包中的隐藏类,这也经常发生。
在pkg / MyClass.java中
public class MyClass {
...
}
在pkg / MyHiddenClass.java中
class MyHiddenClass {
final MyClass outer;
MyHiddenClass( MyClass outer )
{
this.outer = outer;
}
...
}
现在,当您想要访问外部类的方法或变量时,需要使用outer.作为前缀,但是当外部实例的引用由编译器合成创建时,您将获得与之前基本相同的功能。
谢谢,这样做了。
但这在技术上并不是一个内在的阶级。
MyClass的私有属性不能从MyHiddenClass中评估,MyHiddenClass是受保护的,而不是私有的。
不能.Java源代码不能跨多个文件分割。你需要一个类似于C#中的部分类的构造,Java没有。
内部类的对象保持对paren类的对象的隐式引用。
如果嵌套类不是static(它是内部),则不能。但是如果嵌套类不需要直接访问父类的实例并且不需要访问私有字段,那么重构就好了,将内部类移出并且不要将其声明为public(在该包之外不能被访问)。
我认为你有一个神对象或类似的东西,想重构你的代码
http://en.wikipedia.org/wiki/God_object
+1用于解释该术语。也许这是真的。
是的,使用级联跳线。级联跳线是一个抽象的非静态内部类,可以在其他任何地方定义。
MyClass.java
public class MyClass {
public abstract class CascadeJumper {}
}
MyNestedClass
private class MyNestedClass extends MyClass.CascadeJumper {
MyNestedClass(MyClass dollarOne) {
dollarOne.super(); // yes, is possible!
}
}
问候
我不知道这是如何工作的。从MyNestedClass开始,您仍然只能访问MyClass的公共方法和字段,就像从任何其他类一样。
@Alphaaa Nope,您可以访问私有字段,私有枚举,私有类和私有方法,私有构造函数,只需中MyClass的所有内容!试试吧!
我做了,你不能。事实上,即使是正常的内部类也不能根据这个:docstore.mik.ua/orelly/java-ent/jnut/ch03_13.htm。 java编译器实际上通过生成包私有方法将访问转换为外部类私有字段,并通过调用这些生成的方法之一替换任何直接字段访问。所有课程都是最高级别的。
这不起作用,虽然看起来很酷。私有属性意味着只能从类中访问它们。当我的嵌套类是外部的时,它不起作用。这可能只有在我将外部类的计算必需属性引用为抽象嵌套超类的受保护属性时才有效。
您可以创建两个扩展的抽象基类。
但是,如果这些类很大,那么最好重新评估类设计,看看是否可以重构为代表每个问题的类。