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

Java 可以通过某种方式限定最终参数以解决与匿名类成员的命名冲突吗?,java,scope,anonymous-class,Java,Scope,Anonymous Class,“为什么要这样做?有什么问题吗?”尽管如此,是否有任何方法可以在不更改最终方法参数名称的情况下完成此操作 private Foo createAnonymousFoo(final Bar bar) { return new Foo() { private Bar bar = SomeUnknownScopeQualifier.bar; public Bar getBar() { return bar; }

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

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
更改为类似
final Bar startBar
的内容,然后分配就可以了。但是出于好奇,有没有可能特别提到最后一个条形图(类似于你说的超级。这个)?

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

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

    // ...
  };
}

我想你的问题的答案是“不”。从:

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


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

“为什么这样做?”:)它实际上并不像您想象的那样应受谴责。我创建了一个文档生成器,并使用visitor模式编写项目,在电子表格的情况下,我只是从“startCell”(最后的方法参数)开始在单元格上迭代,然后使用
cell=cell.nextCell()
,其中,单元格是ItemVisitor要写入的当前单元格。这似乎与仅命名方法参数<代码>别名?方法参数名称可能可用于代码完成工具或类似工具。因此,最好在公共API中使用自文档名称,并在内部使用一个不同的(尽管可能是神秘的)名称。我对这个问题投了更高的票,因为它是一个有用且有洞察力的答案。然而,亚历克斯的回答引用了JLS,我觉得我应该接受这个答案。