在Java文件外部定义内部类

8
我想创建一个名为ClassB的类,作为ClassA的内部类,但我希望在ClassA.java文件之外编写它。
请问如何实现这一点?
如果所有内部类都这样做,那么ClassA.java文件将变得非常庞大。 更新: 我想定义十个类,并且它们只能被一个类访问。所有这些类都在同一个包中定义。
谢谢。

1
通常我不喜欢告诉问题发起者他们做错了,但在这种情况下,也许加点上下文会有帮助?定义“多个”内部类通常不是一个好主意。 - Jeremy
好的。我真正想做的是定义十个类,它们只能被一个类访问。它们都定义在同一个包内。 - VansFannel
4
如果是这种情况,您可以将所有10个类定义为包级私有。也就是说,不要写public class Hello,而是写class Hello。这样只有在该包中的类才能访问它们。 - Jeremy
你的问题本身就存在矛盾。inner类被定义为一个非static嵌套类。除了在另一个类中定义,没有其他的方法来定义它们。如果你真的是指嵌套类,那你所问的很简单。 - user207421
4个回答

14

简单的回答是,不行。

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

如果您的类真的会变得非常庞大,这可能意味着您的类的设计存在问题。您是否正确使用了封装?


1
好的。我真正想做的是定义十个类,它们只能被一个类访问。它们都在同一个包中定义。 - VansFannel
你需要将所有的类放在一个包内,并将你的类设置为包级别,这样它们就无法在包外被访问。 - Codemwnci

9
把所有的类放在一个包里,并定义这些类的访问权限为包级私有。
package com.example.here

class Hello{
    //...
}

注意关键字public的缺失吗?只有当创建它的类位于com.example.here包中时,您才能创建类Hello的实例。


3

尝试以下方法...

  • 将外部类的引用交给不再是内部类的类
  • 使用包并使不再是内部类的类成为包私有(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() 返回其更具体的(后代)实例。

再次强调:这个方法可能会被恶意使用来创建非常糟糕和难以阅读的代码,但是,在正确的情况下它也可以用于非常好的模式设计,无论如何,它都应该回答原始问题。


2
更新
我真正想做的是定义十个类,它们只能被一个类访问。所有这些类都定义在同一个包中。
如果您想将访问权限限制为单个类,则可以将它们全部放入新包中。您还需要将允许访问的指定类移动到此包中。对于新类,您可以使用默认访问级别(没有public/private/protected修饰符)来限制访问。这将使它们仅对其所在包中的类可访问。允许访问的指定类可以被设置为公共类,以便可以在此新包之外使用。
注意:您可以选择限制类的可见性或构造函数的可见性。

将软件包移动到不同的位置并不是一个好的解决方案,这会限制在软件包中使用的功能。如果这个问题只出现在一个无人关注的一次性程序中,那么这可能是一个可行的解决方案。 - none

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接