外部文件中的嵌套/内部类



我有一个类MyClass和一个内部类MyNestedClass,如下所示:

public class MyClass {
  ...
  public class MyNestedClass {
    ...
  }
}

两节课都很长。正因为如此,我想在不破坏层次结构的情况下,将它们分为两个不同的文件。这是因为使用MyClass的程序员不应该看到嵌套类。

有办法做到这一点吗?

您可以将内部类包设为私有包,这意味着只能从完全相同的包中的其他类访问它。对于标准JDK包(如java.langjava.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!
  }
}

问候

您可以创建在两者中都进行扩展的抽象基类。

然而,如果这些类很大,那么您最好重新评估类设计,看看是否可以重构为分别代表一个关注点的类。

相关内容

  • 没有找到相关文章

最新更新