在外部类的构造函数中实例化内部类是危险的吗? (JAVA)

时间:2018-02-16 02:49:55

标签: java swing inner-classes

我目前正在学习使用Swing。至少对于相对简单的项目,直接在构造函数中实例化组件或构造函数调用的辅助方法似乎很自然。我不得不经常使用ActionListener,并且我经常试图在它们构建后立即将它们添加到组件中,特别是对于只需要一行或两行代码的动作。但是我也很担心这样做,因为非静态嵌套类的实例具有对外部实例的隐式引用,并且我认为在构造函数中实例化它们具有与“泄漏this”相同的危险。但是,我已经看到了一些人们这样做的例子,他们似乎知道他们在做什么,甚至Java网站上的例子做了类似的事情:

public class ButtonDemo extends JPanel
                    implements ActionListener {
protected JButton b1, b2, b3;
// ...
b1.addActionListener(this);
b3.addActionListener(this);
// ...

这不完全相同,但我认为它会带来同样的危险。

以下是我的代码中的示例:

private class DisplayUpdater
{
    private long startTime;    // in milliseconds
    private int elapsedTime;    // in seconds
    private int millisRemaining;
    private Timer timer;

    DisplayUpdater()
    {
        elapsedTime = 0;
        millisRemaining = 1000;
        timer = new Timer(millisRemaining, new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent event)
            {
                elapsedTime++;
                display.setText(String.format("%d:%d", elapsedTime / 60, elapsedTime % 60));
            }
        });
        startTime = System.currentTimeMillis();
    }

在某些情况下这样做是否合适?我自然会认为如果可能的话我应该避免它,但我不确定。答案,建议等将不胜感激。

1 个答案:

答案 0 :(得分:1)

这样做很安全。它被称为lambda表达式或匿名函数。它有助于保持代码的清洁和可读性。

它还可以使您的代码适应性强且易于添加。