Java-其他文件中的嵌套类

时间:2018-06-21 16:03:11

标签: java oop inner-classes

我有类似的东西:

class Outer {
  // a lot of code...
  class Inner {
    // a lot of code...
  }
}

这正是我想要的技术方式(我希望Inner成为嵌套的非静态类)。该文件很长,在这个项目中我经常使用这种模式。为了提高可读性,我想将Outer类和Inner类放在各自的文件中-但我应该将它们分别保留为“ Inner”和“ Outer”(即,将Inner类用作对以下对象的访问权限)外部类,并且可以访问任何字段,包括私有字段。

我想到的一个解决方案是放置一个嵌套接口,并将其继承到另一个文件中。但是,基于this question,看来嵌套接口只能是静态的。

还要注意,此问题不是this one: "putting nested classes in separate files"的重复,因为该问题的目的是使嵌套类不再嵌套。我希望内部类仍然是另一个文件中的内部类。

This question是关于抽象内部类的,但是未指定JVM是否也将该抽象类的子级视为内部子类。

这可能吗?如果是这样,我该怎么办?

3 个答案:

答案 0 :(得分:1)

我认为不可能有一个真正的嵌套类,在单独的文件中有两个类。

我想您可以得到的最接近的方法是,声明要以protected而不是private访问的“内部”类中的字段。这样,只要它们在同一包中,就可以从“外部”类访问它们。请注意,这意味着包中的其他类也可以访问这些字段。

如果只有外部类可以访问这些字段很重要,我建议您只嵌套内部类。

答案 1 :(得分:1)

据我所知,没有办法在一个单独的文件中包含一个内部类,并使它保持其特权位置。 Java没有#include类型语法。 Java期望单个类“拥有” .java文件,在这种情况下,它是您的外部类。您不能从任何其他.java文件的外部类直接访问内部私有数据或本地变量。

您最好的选择可能是将内部类的各个部分移到其自己的类中,使其抽象化,并尽可能多地转移逻辑。创建一个新的内部类,并使其扩展新的独立类,并使内部类实现需要访问外部类内部的任何内容,而您将无法从外部访问该内部类。

答案 2 :(得分:1)

一种方法是将您的类移到它们自己的包中,其中Outer类将其要与Inner类共享的所有成员声明为package private(无访问权限)修饰符)。

package some.pkg;

public class Outer{
    int sharedMember;

    // Other field, consturctors methods and so on
}

class Inner extends Outer{
    void doSomething(){
         int i = super.sharedMember;

         // Do something with it
    }
}

这是Java源代码中许多类已经完成的工作。您仍然必须使用Outer扩展到Inner类,以使其工作