在java文件外定义内部类

时间:2010-10-31 14:48:48

标签: java inner-classes

我想创建一个类ClassB作为ClassA的内部类,但我想在ClassA.java文件外写下来。

我该怎么做?

这将是很多内部类,ClassA.java文件将巨大

更新
我真正想要做的是定义十个类,它们只能由一个类访问。所有这些都在同一个包中定义。

感谢。

4 个答案:

答案 0 :(得分:13)

简单的答案是,不,你不能。

由于是内部类,该类必须在父类的范围内。

如果你的课程确实非常庞大,那么它可能会说明你班级的设计。你正在正确使用封装吗?

答案 1 :(得分:8)

将所有类放在一个包中,并将类定义为包私有。

package com.example.here

class Hello{
    //...
}

注意缺少关键字public?如果创建它的类在com.example.here包中,您将只能创建Hello类的实例。

答案 2 :(得分:2)

  

UPDATE
  我真正想要做的是定义十个类,它们只能由一个类访问。所有这些都在同一个包中定义。

如果要限制对单个类的访问,可以将它们全部放在新包中。您还需要将允许访问的指定类移动到此包中。对于新类,您可以使用默认访问级别(无public / private / protected修饰符)来限制访问权限。这将使它们只能访问其包中的类。允许访问的指定类可以公开,以便可以在此新包之外使用它。

注意:您可以选择限制类的可见性或构造函数的可见性。

答案 3 :(得分:1)

请尝试以下方法......

  • 将外部类的引用移交给不再内部的类
  • 使用包并使不再内部类包私有(Jeremy的回答)
  • 在极少数情况下,最好是与内部课程一起学习,同时让他们在其他地方工作。如果这真的是你,请继续阅读......

如何保持内部小班

a)从外部类扩展

class Outer {

    class SomeInnerClass extends SomeClass {
        // More specific code here
    }
}

class SomeClass {
    // A lot of generic code here (in a different file)
}

b)使用抽象方法

使用内部类的一个(更正确的)原因通常与使用外部类的确切实例有关。要在基类中以通用方式处理它,请使用抽象getter。

abstract class SomeClass {

    protected abstract SpecificData getSpecificData();

    void someMethod() {
        SpecificData specificData = getSpecificData();

        // Do work with the "specific data" here ...
    }
}


class Outer {

    private SpecificData mSpecificData = new SpecificData();

    class SomeInnerClass extends SomeClass {

        @Override
        protected SpecificData getSpecificData() {
            return OuterClass.mSpecificData;
        }
    }
}

我认为你明白了这一点......你也可以考虑使用一些GeneralData类或接口(在SomeClass内),让getSpecificData()返回更具体的(下降) - )它的实例。

再说一遍:这可能会非常误用于创建非常糟糕的不可读代码,但它也可以在适当的情况下用于非常好的模式,无论如何它应该回答原始问题。