什么是内部类的目的

问题描述 投票:42回答:8

我检讨内部类的Java中的概念。从我的理解和应用的Java内部类到目前为止,有一个链接或访问方法和其外部/封闭类的领域。

我的问题:

  1. 当应建立或定义一个内部类?
  2. 被认为是内部类被称为“辅助类”?
  3. 什么是你的指标作出一个内部类的,什么是自己的另一目的是什么?
java oop class inner-classes
8个回答
41
投票

内部类是最适合的是在一个地方使用逻辑分组类的目的。例如,如果你想创建它使用只包含类类,那么就没有任何意义创建一个单独的文件。相反,你可以将它列为“内部类”

java tutorial

使用嵌套类令人信服的理由包括以下内容:

  • 它的逻辑分组那些只在一个地方使用的类的方法。
  • 它增加了封装。
  • 它可以导致更易读和维护的代码。

14
投票

一个典型的使用用于内类是一个容器内的迭代器的执行(ArrayList,例如 - 寻找class Itr)。所有的容器要暴露给世界其他国家是Iterator。但是,它必须创造出一些具体的实现,迭代器,可能熟悉容器的内部。使用一个内部类隐藏了实现,同时保持接近容器的实现。并且是内(即非静态的),它被绑定到该容器中,它可以访问专用容器部件的具体实例。

a few types of inner classes - 非静态嵌套类,地方类和匿名类。每个人都有一个稍微不同的目的,所以问一个内部类的时候,你应该指定什么样的你在说什么。

假设你指的非静态内部类,我会说使用他们的理由是一样的使用普通班(即抽象和划分代码为逻辑单元),但没有理由让这款采用可视类到世界各地。您也可以嵌套类公众,当然,在这种情况下,你让他们嵌套的,而不是独立的,以表达他们对外部类紧张关系。


4
投票
  1. 请参阅主要原因Java tutorial
  2. 如果“辅助类”你的意思是仅供内部使用,那么不,不一定。你可能想这样做 class Outer { private static class Inner implements InterestingInterface { // whatever } public InterestingInterface make_something_interesting() { return new Inner(); } } 在这里,Inner不是“辅助类”在这个意义上,外界也能看到它的实例,但它的实现完全隐藏 - 外界只知道它得到了一些对象实现InterestingInterface

3
投票

作为一般规则,目的应被设计为一个单一的责任(高内聚)。换句话说,精心设计的任何对象,应执行单一的连贯的任务。这将被认为是面向对象设计的最佳实践。

然而,有时候,开发者可以设计出需要为了工作一个单独的专业类的类。这个独立的专业类可以被视为一个辅助类。

如果辅助类,不使用其他任何类,那么这将被认为是总理候选人作为一个内部类

如通过引起上述ncmathsadist,的内部类中使用的例子是在事件处理程序的执行。

例如,在设计的图形用户界面(GUI),开发者可以创建用户按下后执行特定任务的按钮。

该按钮将需要一个事件处理程序监听当按下特定的按钮。

在这种情况下,创建按钮的事件处理程序的内部类是作为内部类不会被利用其他以外的位置不是与GUI类中的特定按钮的最佳实践。


3
投票

内部类的目的之一是为了添加监听。例如,假设你有一个JMenuItem。你可以把它退出你的应用程序如以下代码所示:

JMenuItem quitItem = new JMenuItem("Quit");
quitItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    {
        //cleanup code before exiting
        System.exit(0);
    }
});

您可能还需要一个类来访问外部类中的状态变量是完全屈从于这个类。例如,考虑编写一个简单的颜色计算器。它可能为你键入一个十六进制代码的文本区域。当你按下回车键,你要一个JPanel显示的颜色。这里是你可以做的粗轮廓。

public class ColorCalc extends JPanel implements Runnable
{
    Color displayedColor;
    JTextArea colorEnterArea;
    public ColorCalc()
    {
        displayedColor = Color.white
        colorEnterArea = new JTextArea();
    }
    public void run()
    {
        //build GUI here
    }
    public static void main(String[] args)
    {
         ColorCalc cc = new ColorCalc();
         javax.swing.SwingUtilities.invokeLater(cc);
    }
    //subservient inner class with access to outer class state variable.
    class ColorPanel extends JPanel
    {
         public void paintComponent(Graphics g)
         {
             g.setColor(displayedColor);
             g.fillRect(0,0,getWidth(), getHeight());
         } 
    }

}

2
投票

如果您发现有足够的代码可以通过类来实现更好的类提供了我们指定的统计和行为与领域和方法,你不想需要封闭类以外的地方使用这个类。你应该使用内部类。

这里内部类是从外面的世界隐藏。内部类可以访问封装类,它为我们提供了封装的私有成员。

让我给例如..假设你想设置的齿轮周期,你有一个业务规则像有只到6个挡位。所以,你可以创建内部类周期将必须设置齿轮的方法。该方法具有一些验证其设置gear.like循环之前运行检查...齿轮数目小于6 ...

最好的例子就是事件处理代码使用内部类(有时是匿名内部类),而不为您的活动创建单独的事件对象和事件监听器类来创建事件和监听..


1
投票

这是一个风格问题。任何可以与一个内部类来完成,也可以作为如一系列外部类的完成。内部类是对于重量轻或紧密结合的封闭类的类特别有用。例如,比较经常是这两种东西。它需要的类的实现的深入了解,并可能只有几行代码。这可能是作为一个内部类的理想人选。


0
投票

用于分组类逻辑,例如,如果你有B类和这个类只在A级使用,因此,最好是把B类作为A类的内部类,因为这会给可读性和可重用性的内部类你的代码。

快乐代码:)


-2
投票

我只是认为这是语言的只是一个特性。我不建议使用它,如果我们采用OOD和遵守SOLID原则。

© www.soinside.com 2019 - 2024. All rights reserved.