Java内部类设计的优点

Java内部类设计的优点,java,inner-classes,Java,Inner Classes,在java中,可以有内部类。从设计的角度来看,我很好奇这是否有什么好处 我最初的想法是,在类中有一个单独的文件可以更清晰地将事物分割成可重用的模块。通过这样做,如果其他类希望使用该其他类,它们也可以创建自己的实例。在我看来,避免内部类可能是更好的可扩展性和代码重用设计,在处理新项目时,通常很难判断类是否会被重用。。。因此,我觉得支持单独上课是一种方式 我问这个问题是因为我接手了一个项目,这个项目有很多这样的。。。这让我觉得以前的开发人员可能只是懒惰或不熟悉IDE。但我想确保我没有错过这些内部类所

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

我最初的想法是,在类中有一个单独的文件可以更清晰地将事物分割成可重用的模块。通过这样做,如果其他类希望使用该其他类,它们也可以创建自己的实例。在我看来,避免内部类可能是更好的可扩展性和代码重用设计,在处理新项目时,通常很难判断类是否会被重用。。。因此,我觉得支持单独上课是一种方式


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

内部类对于:

  • 隐藏实现细节

  • 使项目视图更加简洁,从而易于理解

  • 添加相关代码的逻辑分组


  • 我想到的内部类的一个好用法是将迭代器实现隐藏到
    私有内部类中。只能通过调用列表对象上的
    iterator()
    listIterator()
    来创建它们

    这样,
    ArrayList
    Iterator
    ListIterator
    实现与它们的相关类和方法一起分组,以增强可读性(实现非常简短),但对其他实现是隐藏的

    它们不能声明为
    静态
    ,因为它们需要访问其封闭的实例对象

    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> {
        ...
        }
    }
    
    公共类ArrayList扩展了AbstractList
    实现列表、随机访问、可克隆、java.io.Serializable{
    ...
    公共迭代器迭代器(){
    返回新的Itr();
    }
    私有类Itr实现迭代器{
    ...
    }
    公共ListIterator ListIterator(){
    返回新的ListItr(0);
    }
    私有类ListItr扩展了Itr实现ListIterator{
    ...
    }
    }
    
    当内部类不在包含类之外使用时,它们是好的-这是一种减少类膨胀的方法。一般来说,这是我唯一一次使用它们

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

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

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

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

    e、 g_1)使用静态内部类检索Sigleton对象
    e、 g_2)生成器模式

    e、 类的g_3)比较器实现

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

    你真的是指内部类还是[静态]嵌套类?首先,内部类可以访问外部类的成员,所以有时它可以帮助对象/类的封装(避免不必要的getter和setter)。他们在做内部类,但我也欢迎任何关于静态嵌套类的评论。例如,生成器模式是基于内部类的。Guava也经常使用它们发现了一些有趣的东西,有效的Java Ch.4第22项对静态成员类、非静态memeber类、匿名类和本地类进行了很好的分解。我遇到的问题是一个文件似乎有10个这样的,所以文件很长,我发现将分类分开似乎让我更容易阅读…测试有什么好处或坏处吗?常识总是适用的。如果一个类有10个内部类,那么很可能这个类有太多的事情要做,应该分成不同的类。这对于任何“看起来太长”的类都是正确的,不管内部类的数量如何。