能否最终参数以某种方式加以限定,以解决与匿名类成员命名冲突?(Can final parameter

2019-07-28 22:49发布

“你为什么这样做有什么不妥吗?” 尽管如此,有没有办法做到这一点不改变最终的方法参数的名字吗?

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电话,你就不需要杆件等。 在这种情况下,简单的解决方法就是改变final Bar bar喜欢的东西final Bar startBar然后分配是好的。 但出于好奇,是有可能专指final Bar (你会说的方式类似Super.this )?

Answer 1:

我想回答你的问题是“不”。 从Java语言规范 :

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

换句话说,没有什么可以取代SomeUnknownScopeQualifier在您的示例代码,以使赋值语句中的内部类是指正式的参数名称用。



Answer 2:

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

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

    // ...
  };
}


文章来源: Can final parameters be qualified in some way to resolve naming conflicts with anonymous class members?