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

Java:有没有办法将嵌套类放在一个单独的文件中?,java,partial-classes,Java,Partial Classes,我有一个大约4000行长的Java类(很多方法)。然后,这个类使用了大约200个只需要它的小类,因此又需要4000行代码 如果这是C#,我会将其他类放在一个部分类文件中,这样文件就不同了,但它们仍然是私有嵌套类,只有父类才能看到 有没有一种在Java中实现这一点的方法?我不是要求某些方法位于不同的文件中,而是要求私有嵌套类位于不同的文件中 谢谢-dave您不能将一个类放在另一个文件中,而只将它设置为另一个类的私有 不使用类访问修饰符 您可以做的是将类放在没有访问修饰符的单独文件中(省略“publ

我有一个大约4000行长的Java类(很多方法)。然后,这个类使用了大约200个只需要它的小类,因此又需要4000行代码

如果这是C#,我会将其他类放在一个部分类文件中,这样文件就不同了,但它们仍然是私有嵌套类,只有父类才能看到

有没有一种在Java中实现这一点的方法?我不是要求某些方法位于不同的文件中,而是要求私有嵌套类位于不同的文件中


谢谢-dave

您不能将一个类放在另一个文件中,而只将它设置为另一个类的私有

不使用类访问修饰符 您可以做的是将类放在没有访问修饰符的单独文件中(省略“public”),这将使它们包私有,即仅在其自己的包中可见。另见

UtilClasses.java:

package OurPackage;

class UtilClass1
{
}
class UtilClass2
{
}
MainClass.java:

package OurPackage;

public class MainClass
{
   UtilClass1 iAmAUtilClass;
}
package OurPackage;

public class MainClass implements BaseInterface
{
   UtilClass1 iAmAUtilClass;
}

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

BaseInterface.java:

package OurPackage;

interface BaseInterface
{
   class UtilClass1
   {
   }
}
MainClass.java:

package OurPackage;

public class MainClass
{
   UtilClass1 iAmAUtilClass;
}
package OurPackage;

public class MainClass implements BaseInterface
{
   UtilClass1 iAmAUtilClass;
}
您还可以使用基类而不是接口,并以大致相同的效果对其进行扩展


您不需要实现
BaseInterface
来访问其嵌套类,但是,如果不需要,您需要使用
BaseClass.UtilClass1
而不仅仅是
UtilClass1

内部私有类不能被“提取”,并且仍然只能对一个特定类可见。注释中已经提到了一个解决方案:创建一个包含“main”类和所有以前的内部类的包,并使内部类包可见。这还允许您为内部类的正确功能创建单元测试,这很可能是因为单元测试目前无法“访问”内部类,所以目前还没有发生


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

可以用顶层替换内部类,但是你必须手工重写很多编译器,这些编译器会自动为你提供内部类关系。对于虚拟机来说,内部类没有什么特别的,它只是与外部类在同一个包中的另一个类,具有一个奇特的名称。但是编译器在后台创建了很多帮助器构造,您必须手动重建(或者让一些重构工具为您重建):

  • 内部类可以引用外部
    实例,方法是在其前面加上外部类名。您需要将外部
    this
    传递到内部构造函数中,并将其存储在类似
    outerThis
    的字段中以获得访问权限
  • 在源代码中,可以直接调用外部类方法。您需要像重写outerThis.method()一样重写它。这同样适用于字段
  • 为了使私有外部方法和字段变得可访问,编译器将为您创建桥结构。您必须更改访问修饰符或自己创建包私有桥方法

最终,您将使以前的内部类至少在包中可见,并且比原始类更详细,但另一方面,您将获得更好的隔离性和可测试性。

有没有理由不将它们作为类放在同一个包中?(顺便问一下,一个4000行长的类文件太长了3800行)这些类是静态的,还是在一个4000行的类中使用了一些“很多方法”呢?把这个类和所有的子类放在一个单独的包中,然后给子类包私有可见性。@Stewart:我认为对类的长度设置任意限制不是一个好主意。如果没有上下文,我们真的不知道这是否太多。你会发现很多类型大约有一千行长,但我一般不觉得它们太大。如果你有相当多的方法,每个方法都有大量的文档,那么它可以很容易地安装起来。@David默认的可见性是包私有的。什么意思?