是否可以通过某种方式限定最终参数以解决与匿名类成员的命名冲突?

时间:2012-04-13 16:34:26

标签: java scope anonymous-class

“你为什么这样做会对你有什么不妥?”尽管如此,有没有办法在不改变最终方法参数名的情况下完成这个?

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)?

2 个答案:

答案 0 :(得分:7)

我认为你问题的答案是“不”。来自Java Language Specification

  

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

换句话说,在示例代码中没有任何东西可以替换SomeUnknownScopeQualifier,以使内部类中的赋值语句引用形式参数名称。

答案 1 :(得分:3)

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

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

    // ...
  };
}