当前位置: 首页 > 知识库问答 >
问题:

对匿名内部类使用最终的 1 元素数组

左丘宜然
2023-03-14

我偶然发现了这个技巧,用于将值从匿名内部类获取到在外部类中声明的变量。它有效,但它感觉像一个肮脏的黑客:

private int showDialog()
{
    final int[] myValue = new int[1];

    JPanel panel = new JPanel();
    final JDialog dialog = new JDialog(mainWindow, "Hit the button", true);
    dialog.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );

    JButton button = new JButton("Hit me!");
    button.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            myValue[0] = 42;
            dialog.setVisible(false);
        }
    });

    panel.add(button);
    dialog.add(panel);
    dialog.pack();
    dialog.setVisible(true);

    return myValue[0];
}

(是的,我意识到这个例子可以用一个简单的<code>JOptionPane,但我不能将<code>myValue

共有3个答案

桓兴腾
2023-03-14

那看起来确实很脏。我真的说不出它有多“常见”,我也不知道你这样做是否冒着毁灭世界的风险,但是如果我需要这样的东西,我宁愿咬紧牙关,编写一个成熟的内部类(而不是匿名类)来实现< code>ActionListener。这样,您可以让它影响其封闭类的字段,并根据需要调用封闭类中的其他方法。根据您具体在做什么,完全投入并子类化< code>Dialog来保持这种逻辑可能是值得的。

额外的好处是,非匿名内部类使调试变得不那么痛苦,因为您有更多的信息类标识符可用。

吕征
2023-03-14

使用原子整数或原子参考可以使它好不了多少。这实际上是一种常见的做法,但您可以通过引入实现ActionListener并通过getter提供值的实际类来使其更清晰。

祁建业
2023-03-14

如果代码是清晰的,确实如此,我不会说这样做很糟糕。

另一种选择是让JButton调用类中具有show Dialog的函数(这是允许的)。该函数可以设置一个将返回的实例变量。但这对我来说似乎不太清楚,所以我实际上更喜欢你的方法。

除非你正在制作一个深度分层的UI框架,否则有时这些小技巧正是你应该做的事情。

如果你担心,你可以用一个私有的内部类做同样的事情:

private class DialogReturnValue {
    public int value;
}

private int showDialog()
{
    final DialogReturnValue myValue = new DialogReturnValue();

    JPanel panel = new JPanel();
    final JDialog dialog = new JDialog(mainWindow, "Hit the button", true);
    dialog.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );

    JButton button = new JButton("Hit me!");
    button.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            myValue.value = 42;
            dialog.setVisible(false);
        }
    });

    panel.add(button);
    dialog.add(panel);
    dialog.pack();
    dialog.setVisible(true);

    return myValue.value;
}

还有一些ActionListeners(这可能是“正确”的方法)。

 类似资料:
  • 在此代码示例中,ActionListener的actionPerformed函数中没有使用最终对象jLabel:

  • 在以下片段中: 有没有办法从内部匿名类引用匿名类的外部实例? 第二个错误是在解决方案上,我在这里找到了一个匿名内部类的外部类的关键字。这些问题似乎共享一些概念和问题空间,但性质不同。

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除

  • 问题内容: 如何在我的匿名内部子类中获取传递给此方法的值? 我收到此错误: 无法在以其他方法定义的内部类中引用非最终变量userID 我很确定我不能将其赋值为final,因为它是一个未知值的变量。我听说这种语法确实以某种方式保留了作用域,所以我认为必须有一个我不太了解的语法技巧。 问题答案: 当然,您可以将其分配为final-只需将该关键字放入参数的声明中即可: 我不确定这是一个未知值的变量是什么

  • 问题内容: 我正在编写C#Wicket实现,以加深对C#和Wicket的理解。我们遇到的问题之一是Wicket大量使用匿名内部类,而C#没有匿名内部类。 因此,例如,在Wicket中,您可以这样定义一个链接: 由于Link是一个抽象类,因此它强制实现者实现onClick方法。 但是,在C#中,由于没有匿名内部类,因此无法做到这一点。另外,您可以使用如下事件: 当然,这样做有两个缺点。首先,可以有多

  • 本文向大家介绍Java匿名类,匿名内部类实例分析,包括了Java匿名类,匿名内部类实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java匿名类,匿名内部类。分享给大家供大家参考,具体如下: 内部类 匿名类  首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定