【问题标题】:Java Inner Classes Design BenefitsJava 内部类设计的好处
【发布时间】:2013-04-18 13:50:32
【问题描述】:

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

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

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

【问题讨论】:

  • 你真的是指内部类,还是[静态]嵌套类?
  • 一方面,内部类可以访问外部类的成员,因此有时它有助于对象/类的封装(避免不必要的 getter 和 setter)。
  • 他们在做内部类,但我也欢迎任何关于静态嵌套类的 cmets。
  • Builder 模式例如基于内部类。 Guava 也经常使用它们Builder
  • 发现了一些有趣的东西,Effective Java Ch.4 Item 22 很好地分解了静态成员类、非静态成员类、匿名类和本地类。

标签: java inner-classes


【解决方案1】:

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

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

【讨论】:

  • 我喜欢关于班级膨胀的评论。我遇到的问题是一个文件似乎有 10 个这样的文件,所以文件很长,我发现将这些分类分开似乎让我更容易阅读......
  • 测试有什么好处或坏处吗?
  • 常识总是适用的。如果一个类有 10 个内部类,则很可能该类有太多的内容,应该分成单独的类。对于任何“看起来太长”的类都是如此,无论内部类的数量是多少。
【解决方案2】:

内部类可用于:

  1. 隐藏实现细节。

  2. 使项目视图更简洁易懂。

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

【讨论】:

    【解决方案3】:

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

    这样,ArrayListIteratorListIterator 实现与其相关的类和方法分组以提高可读性(实现非常短),但对其他人隐藏。

    不能将它们声明为 static,因为它们需要访问其封闭的 instance 对象。

    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> {
        ...
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

      e.g_1) 使用静态内部类检索 Sigleton 对象。
      例如_2) 建造者模式
      e.g_3) 类的比较器实现。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2013-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-15
          • 2019-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多