我正在审查Java中的内部类的概念。目前为止,从我理解和应用的角度来看,Java内部类与其外部/封闭类的方法和字段有关或可访问。
我的问题:
- 在什么情况下应该创建或定义内部类?
- 内部类是否被认为是“帮助类”?
- 您制作内部类的指标是什么,它们的其他目的是什么?
我正在审查Java中的内部类的概念。目前为止,从我理解和应用的角度来看,Java内部类与其外部/封闭类的方法和字段有关或可访问。
我的问题:
内部类最适合于将在一个地方使用的类进行逻辑分组。例如,如果您想创建仅由封闭类使用的类,则没有必要为其创建单独的文件。相反,您可以将其添加为“内部类”。
根据Java教程:
使用嵌套类的强制性原因包括以下内容:
- 它是一种将仅在一个地方使用的类逻辑分组的方式。
- 它增加了封装性。
- 它可以导致更可读和可维护的代码。
class Itr
)。容器希望向外界公开的只是一个Iterator
。但是,它必须创建某个具体的该迭代器的实现,可能熟悉容器的内部情况。使用内部类隐藏了实现,同时使其保持接近容器的实现。由于是内部类(即非静态),因此它绑定到该容器的特定实例上,这使得它可以访问私有容器成员。See the Java tutorial for the main reasons.
If by "helper class" you mean something for internal use only, then no, not necessarily. You might want to do something like
class Outer {
private static class Inner implements InterestingInterface {
// whatever
}
public InterestingInterface make_something_interesting() {
return new Inner();
}
}
Here, Inner
is not a "helper class" in the sense that the outside world does get to see instances of it, but its implementation is entirely hidden -- the outside world only knows it gets some object that implements InterestingInterface
.
JMenuItem quitItem = new JMenuItem("Quit");
quitItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
//cleanup code before exiting
System.exit(0);
}
});
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());
}
}
}
这是一个样式问题。任何可以通过内部类完成的操作,也可以作为一系列外部类来完成。内部类对于轻量级或与封闭类紧密绑定的类特别有用。例如,比较器经常具备这两个特征。它需要熟悉类的实现细节,并且可能只有几行代码。它可能是一个理想的内部类候选。
内部类用于分组类逻辑,例如,如果您有B类,且此类仅在A类中使用,则最好将B类作为A类的内部类,这将增加代码的可读性和重用性。
愉快编程:)
从概念上讲,内部类可用于表示在没有父类型的情况下不存在的宇宙中的类型。换句话说,在允许内部类的语言中,所有类型都是“类型定义者”。然后可以将类型视为明确或隐含地定义新类型的东西。
例如,假设我们有一个宇宙,其中“食物”可以应用于任何东西。甚至是它本身。食物是我们宇宙中的基本概念。我们引入了一个名为“肉”的食物子类。如果没有这个概念,“食肉动物”就不存在。因此,我们可以(注意“可以”)定义嵌套类型“Meat.Eater”(它可以实现IEater接口),并将动物定义为不同IEaters列表的包含结构。
一旦我们将肉从宇宙中移除,食肉动物也会消失。
这种哲学思想同样适用于更抽象和技术上有用的安排,例如Memento设计模式中的备忘录、作为嵌套类定义的配置对象以及其他特定于类型的行为或结构。