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 に答える