【问题标题】:Get the parameters of a method in a anonymous class获取匿名类中方法的参数
【发布时间】:2015-09-18 05:32:52
【问题描述】:

我有一个关于键绑定的问题。我有以下 Java 代码:

private void registerPressedReleasedKey(String keyChar, boolean key, boolean pressedKey) {

    // 1. decide if the key is pressed or released
    // 2. save key and its action name
    // 3. decide, what to do, when the action name is being mentioned
    // 4. change the boolean value in actionPerformed(ActionEvent ae)

    String keyStatus;

    if(pressedKey == true)
        keyStatus = "pressed ";
    else
        keyStatus = "released ";
            getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(keyStatus + keyChar), keyStatus + keyChar);
    getActionMap().put(keyStatus + keyChar, new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent ae) {
            key = pressedKey;
        }
    });
}

Eclipse 对我说key = keyPressed; 是错误的,因为我只能使用final 变量。我的问题是是否有可能在actionPerformed(ActionEvent ae) 方法中访问和更改key

【问题讨论】:

  • 从技术上讲,您需要key 的最终持有者对象。最终保证,您不能为 holder 变量分配新引用,但 final 不会阻止通过 setter 更新 holder 对象的状态。
  • 上面的匿名类代码在很多层面上都是错误的:a) 它试图设置key 变量,它是 1. 外部方法参数,2. 除此以外的任何地方都未使用参数,3. 不返回也不存储在任何地方,b) 它使用隐式线程代码 - getActionMap() & AbstractAction 表明正在使用 Swing 组件,这意味着 actionPerformed() 将被 Swing 线程调用,并且代码以上可能会在主线程中执行。因此,该代码本质上是错误的。您无法分配 key 的事实是您遇到的最小问题。
  • @RomanVottner 同意,但请参阅我上面的评论。
  • @vaxquis 这就是我写评论并提到技术方面的原因 - 我没有努力纠正 OP 的设计

标签: java keystroke


【解决方案1】:

回答您的问题

不可能以您尝试的方式修改匿名类中的外部变量,因为它们必须是最终的。

如果这是您的类的一个字段,您可以直接使用访问它(在 Java > 7 中)或使用访问器(setter)。既然不是,那么要走的路是use a wrapper:final意味着你不能分配一个新的值,但你仍然可以调用它的方法,任何访问器基本上都是一个方法。

警告提示

我假设你的代码是不完整的,在这个例子中,你尝试设置变量key,它没有在任何地方使用。

但是,assigning a new value to a parameter is generally a bad practice

此外,getActionMap() & AbstractAction 表明正在使用 Swing 组件,这意味着即使在 registerPressedReleaseKey() 完成之后,Swing 线程也会调用 actionPerformed()。因此,更新此方法的参数是没有意义的。

【讨论】:

  • @downvoter 请解释我的答案有什么问题,以便我可以修改它,并在将来从我的错误中吸取教训。
  • @vaxquis 谢谢,我扩展了我的答案,将您的 cmets 考虑在内。
  • @vaxquis 谢谢,我不知道关于 cmets 的元共识(尽管它是有道理的,就像元上的大多数事情一样)。我也不知道 Java 7 的这种特殊性(现在才开始在工作中使用它)。
  • 我找不到确切的讨论 ATM(几年前我偶然获得了它的链接),但情况仍然如此,例如meta.stackoverflow.com/questions/270105/… 和“所有必要信息都应在 [问题/答案] 本身中”(meta.stackoverflow.com/questions/266764/…),另请参阅 meta.stackoverflow.com/questions/277922/… 等。通常,不应完全保留任何有效信息厘米。
猜你喜欢
  • 1970-01-01
  • 2011-10-13
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多