2012-04-13 9 views
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 startBarのように変更することです。割り当ては問題ありません。しかし、好奇心から、具体的にはfinal BarSuper.thisと同じように)を参照することは可能ですか?

+6

「なぜこのことをやっているのですか? :) – jpm

+0

あなたが想像しているように、実際には批判的ではありません。私はドキュメントビルダーを作成し、訪問者パターンを使ってアイテムを書き出していました。スプレッドシートの場合は、単に「startCell」(最後のメソッドのパラメータ)で始まり、 'cell = cell.nextCell() '。ここで、cellは書き込むItemVisitorの現在のセルです。 –

答えて

7

質問に対する回答は「いいえ」と思います。ローカル変数(14.4)、正式なパラメータ(§8.4.1)、例外パラメータ(§14.20)、およびローカルクラス(14.3)

だけの単純な名前を使用して参照することができます。Java Language Specificationから(§6.2)、修飾された名前ではない(§6.6)。言い換えれば

、あなたは内部クラスの代入文は仮パラメータ名を参照するために、あなたのコード例でSomeUnknownScopeQualifierを交換できることは何もありません。

3

私はそれができないと思います。関連する変数の名前を変更するか、エイリアスを作成してください:

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

    // ... 
    }; 
} 
+0

これはメソッドのパラメータに 'alias'という名前を付けるだけの違いはありませんか? –

+2

メソッドのパラメータ名は、コード補完ツールなどで使用できます。したがって、パブリックAPIで自己文書化する名前を持ち、内部的には(おそらく潜在的な)名前を使用する方が良いでしょう。 – jpm

+0

それは大きなポイントです。これは有用で洞察に満ちた答えなので、私はこれをupvotedしました。しかし、アレックスからの答えは、JLSを引用し、私はそれを受け入れるべきだと感じています。 –

関連する問題