在外部 class 的构造函数中实例化内部 class 是否危险? (Java)
Is it dangerous to instantiate an inner class within the outer class's constructor? (Java)
我目前正在学习使用 Swing。至少对于相对简单的项目,直接在构造函数中或在构造函数调用的辅助方法中实例化组件似乎很自然。我不得不经常使用 ActionListener
,而且我经常想在构建组件后立即将它们添加到组件中,尤其是对于只需要一两行代码的操作。但我也对这样做感到紧张,因为非静态嵌套 类 的实例隐式引用了外部实例,我认为在构造函数中实例化它们会带来与 "leaking 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();
}
在某些情况下可以这样做吗?我自然会假设我应该尽可能避免它,但我不确定。答案、建议等将不胜感激。
这样做很好,也很安全。它被称为 lambda 表达式或匿名函数。它有助于保持您的代码整洁和可读。
它还可以使您的代码适应性强且易于添加。
我目前正在学习使用 Swing。至少对于相对简单的项目,直接在构造函数中或在构造函数调用的辅助方法中实例化组件似乎很自然。我不得不经常使用 ActionListener
,而且我经常想在构建组件后立即将它们添加到组件中,尤其是对于只需要一两行代码的操作。但我也对这样做感到紧张,因为非静态嵌套 类 的实例隐式引用了外部实例,我认为在构造函数中实例化它们会带来与 "leaking 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();
}
在某些情况下可以这样做吗?我自然会假设我应该尽可能避免它,但我不确定。答案、建议等将不胜感激。
这样做很好,也很安全。它被称为 lambda 表达式或匿名函数。它有助于保持您的代码整洁和可读。
它还可以使您的代码适应性强且易于添加。