16

在java中,你可以有内部类。从设计的角度来看,我很好奇这是否有任何好处。

我最初的想法是,在类中使用单独的文件可以更清晰地将事物分成可重用的模块。通过这样做,如果其他类希望使用该其他类,它们也可以创建自己的实例。对我来说,似乎避免内部类可能是可扩展性和代码重用的更好设计,并且在处理新项目时,通常很难判断该类是否会被重用......所以我觉得有单独的课程是要走的路。

我问这个问题是因为我接手了一个有很多这些的项目......这让我觉得以前的开发人员可能只是懒惰或不熟悉 IDE。但我想确保我不会错过这些内部类所具有的任何好处。如果有好处可以告诉我,然后我可以确认以前的开发人员是否利用了这些好处。

4

5 回答 5

18

当内部类不在包含类之外使用时,它们是好的——这是一种减少类膨胀的方法。作为一般规则,这是我唯一一次使用它们。

非静态内部类也可以访问包含实例的私有字段。

于 2013-04-18T14:02:04.450 回答
3

内部类可用于:

  1. 隐藏实现细节。

  2. 使项目视图更简洁,从而易于理解。

  3. 添加相关代码的逻辑分组。

于 2013-04-18T13:57:22.910 回答
2

我想到的内部类的一个很好的用法是在java.util.ArrayList 中,它将其迭代器实现隐藏到private inner classes. iterator()除非通过调用或listIterator()在列表对象上,否则您无法创建它们。

这样,forIteratorListIterator实现ArrayList与它们相关的类和方法分组以增强可读性(实现非常短),但对其他人隐藏。

无法声明static它们,因为它们需要访问其封闭的实例对象。

public class ArrayList<E> extends AbstractList<E>
         implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    ...
    public Iterator<E> iterator() {
         return new Itr();
    }

    private class Itr implements Iterator<E> {
    ...
    }

    public ListIterator<E> listIterator() {
         return new ListItr(0);
    }

    private class ListItr extends Itr implements ListIterator<E> {
    ...
    }
}
于 2013-04-18T14:01:55.523 回答
2

非静态内部类:
1)内部类将用于对外部类执行一些任务并返回输出
。所以它将确保创建外部类对象来访问它。
2)内部类只针对外部类,对外部没有用处。因此无需考虑代码重用。

e.g_1) 内部类的最佳示例是iterator集合框架的实现。Set(AbstractCollection.java) 和 List(AbstractList.java) 将使用不同的迭代器内部类实现。
-> 我们可以重用内部类代码。例如,private class ItrArraylistjava.util.AbstractList 和 Vector 都使用内部类的实现。

静态内部类:
1) 静态内部类不依赖外部类对象;但它特定于外部类级别。它不会暴露给独立的,因为它只特定于外部类。所以没有代码重用。
2)它有一组对所有对象(类级别)通用(共享)的方法 3)

e.g_1) 使用静态内部类检索 Sigleton 对象。
e.g_2) 构建器模式
e.g_3) 类的比较器实现。

于 2013-04-18T14:52:28.880 回答
0

内部类是非常重要的东西,它可以帮助您非常整洁地实现封装需求,您的基类也可以从许多类继承(例如实现抽象处理程序)。每个程序员都可以学习如何在 Java 中使用内部类,这是非常有用的东西。

于 2016-03-16T20:46:36.747 回答