9

“你为什么要这样做,你有什么问题吗?” 尽管如此,有没有办法在不更改最终方法参数名称的情况下完成此操作?

private Foo createAnonymousFoo(final Bar bar) {
    return new Foo() {
        private Bar bar = SomeUnknownScopeQualifier.bar;

        public Bar getBar() {
            return bar;
        }

        public void doSomethingThatReassignsBar() {
            bar = bar.createSomeDerivedInstanceOfBar();
        }
    };
}

显然,如果没有 doSomethingThatReassignsBar 调用,您将不需要成员 Bar 等。在这种情况下,简单的解决方法是更改final Bar bar​​为类似final Bar startBar的内容,然后分配就可以了。但是出于好奇,是否可以专门指final Bar(类似于您所说的方式Super.this)?

4

2 回答 2

7

我认为你的问题的答案是“不”。来自Java 语言规范

局部变量(第 14.4 节)、形参(第 8.4.1 节)、异常参数(第 14.20 节)和本地类(第 14.3 节)只能使用简单名称(第 6.2 节)而不是限定名称( §6.6)。

换句话说,您无法SomeUnknownScopeQualifier在示例代码中替换任何内容以使内部类中的赋值语句引用形式参数名称。

于 2012-04-13T17:15:04.027 回答
3

我认为这是不可能的。重命名涉及的变量或创建别名:

private Foo createAnonymousFoo(final Bar bar) {
  final Bar alias = bar; 
  return new Foo() {
    private Bar bar = alias;

    // ...
  };
}
于 2012-04-13T16:53:56.433 回答