我有一个大约4,000行的Java类(很多方法)。然后这个类使用大约200个只需要它的小类,所以另外有4,000行代码。
如果这是C#,我会把那些其他文件放在一个部分类文件中,但它们仍然是私有嵌套类,只对父类可见。
有没有办法在Java中执行此操作?我不是要求某些方法位于不同的文件中,而是要将私有嵌套类放在不同的文件中。
谢谢 - 戴夫
答案 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()
那样重写它。这同样适用于领域。最后,您将使前面的内部类至少包装可见并且比原始类更冗长,但另一方面,您将获得更好的隔离和可测试性。