Java:嵌套类,接口Vs Package

时间:2014-08-20 16:05:00

标签: java

我正在阅读嵌套类将启用组类&接口逻辑上。

我觉得我们可以通过在包中放置相关的类来实现使用包。

如果是这种情况,那么嵌套类和嵌套接口究竟在哪里发挥作用?我们应该何时考虑使用它们?

3 个答案:

答案 0 :(得分:3)

使用nested classes/interfaces可以做的一件事是,你无法对包进行处理:你可以将私有的类型添加到特定的类中。独立接口和类只能是公共的或具有默认(程序包范围)可见性。如果您希望限制对实现内部的访问,这可能非常有用。

此外,非静态嵌套类将包含对父对象的隐式引用。这减少了您需要编写的代码量 - 不需要参数化的new MyObject(this)构造函数调用 - 尽管如果不使用父对象字段,它也可能会无意中增加类型的大小。

我想说,在某种程度上,内部阶级的使用是设计和个人偏好的问题。例如,在我自己的项目中,当代码变得太大而不适合我的口味时,我经常选择将内部类型拆分为单独的文件。但是,在公共对象中,隐藏实现细节的需求可能更为重要。

PS:顺便说一下,Java编译器为每种类型创建一个单独的class file - 从JVM的POV开始,无论你做什么都是相同的......

答案 1 :(得分:2)

让我们看一下分组。

class Container {
    public class Item {
         ... can use Container.this to access its container.
    }
    private List<Item> items = ...;

    public Item createNewItem() {
        Item item = new Item();
        items.add(item);
        return item;
    }
}

有趣的设计为每个Item提供了对它所在Container的访问。

在具有 Iterator 实现的标准java SE中使用相同的机制。实现类通常是集合的嵌入类,因此可以访问它。

我不知道你引用的背景,但这可能就是我的意思。

此模式允许访问包含类的私有成员,替代方法需要额外的构造函数参数来维护指向包含对象的链接。

答案 2 :(得分:1)

嵌套类(非静态)可以访问非嵌套类所不具备的外部类的实例字段。

您可以将嵌套类或接口声明为private。当类的实现受益于定义其他类或接口时,这很有用;由于类或接口是实现细节,因此应该从使用外部类的客户端隐藏它。如果类或接口位于顶层,则无法执行此操作。 (你可以把它变成package-private,但它仍然可以被同一个包中的其他类看到,这可能是不可取的。我认为这取决于嵌套类的实现与外层实现的紧密程度有多紧密如果嵌套类中的代码与外层类中的代码无关,那么它应该是嵌套的。)

除了这些之外,还可以选择如何命名。在Android中,许多扩展View的类都有自己的嵌套LayoutParams类(超过十几个)。我想他们可以将所有这些类放在顶层并给它们命名为AbsListViewLayoutParamsTableRowLayoutParams等等(而不是AbsListView.LayoutParams等),但实际的选择使很明显,这些是具有与其“父”类密切相关的类似目的的类。设置17个左右的软件包将这些相关的类组合在一起可能会导致一些其他问题(也许他们将无法再访问他们需要的其他类的包私有成员),即使它没有创建也似乎是令人讨厌的这种问题。