Java:有没有办法将嵌套类放在一个单独的文件中?

时间:2018-01-14 13:57:10

标签: java partial-classes

我有一个大约4,000行的Java类(很多方法)。然后这个类使用大约200个只需要它的小类,所以另外有4,000行代码。

如果这是C#,我会把那些其他文件放在一个部分类文件中,但它们仍然是私有嵌套类,只对父类可见。

有没有办法在Java中执行此操作?我不是要求某些方法位于不同的文件中,而是要将私有嵌套类放在不同的文件中。

谢谢 - 戴夫

3 个答案:

答案 0 :(得分:3)

在将类放入另一个文件时,您不能将该类设为私有。

不使用类访问修饰符

你可以做的是将这些类放在没有访问修饰符的单独文件中(省略" public"),这将使它们成为包私有,即仅在其自己的包中可见。另请参阅the official Access Control tutorial

UtilClasses.java:

package OurPackage;

class UtilClass1
{
}
class UtilClass2
{
}

MainClass.java:

package OurPackage;

public class MainClass
{
   UtilClass1 iAmAUtilClass;
}

使用接口或继承

通过省略嵌套类中的访问修饰符,您还可以实现与接口或继承类似的操作。这也是包私有的,但在某些情况下这可能比上面更好,因为它避免了所有嵌套类都在顶层。

BaseInterface.java:

package OurPackage;

interface BaseInterface
{
   class UtilClass1
   {
   }
}

MainClass.java:

package OurPackage;

public class MainClass implements BaseInterface
{
   UtilClass1 iAmAUtilClass;
}

您也可以使用基类而不是接口,并以大致相同的效果扩展它。

您不需要实施BaseInterface获取对其嵌套类的访问权限,但是,如果您不这样做,则需要使用BaseClass.UtilClass1而不是仅仅{0}} UtilClass1

答案 1 :(得分:1)

内部私有类不能“提取”,只能对一个特定类可见。注释中已经提到了一个解决方案:创建一个包含“main”类和所有以前内部类的包,并使内部类包可见。这也可以让你创建单元测试来测试内部类的正确功能,这是目前最不可能发生的事情,因为内部类目前无法通过单元测试“到达”。 / p>

在Java中不存在像C ++这样的类之间声明“友谊”的概念。

答案 2 :(得分:0)

您可以使用顶级类替换内部类,但是您必须手动重写许多内容,编译器会使用内部类关系为您自动连接。对于虚拟机而言,内部类并不特别,它只是与具有奇特名称的外部类相同的包中的另一个类。但是编译器在底层创建了很多辅助构造,你必须手工重建(或者有一些重构工具为你做这个):

  • 内部类可以引用外部this实例,前缀为外部类名。您需要将外部this传递到内部构造函数中,并将其存储在outerThis之类的字段中以便访问。
  • 在源代码中,您可以直接调用外部类方法。你需要像outerThis.method()那样重写它。这同样适用于领域。
  • 要使私有外部方法和字段可访问,编译器会为您创建桥构造。您必须自己更改访问修饰符或创建包私有桥接方法。

最后,您将使前面的内部类至少包装可见并且比原始类更冗长,但另一方面,您将获得更好的隔离和可测试性。