2012-04-13 10 views
9

"Dlaczego robisz to, co jest z tobą nie tak?" niezależnie od tego, czy jest jakiś sposób na osiągnięcie tego bez zmiany nazwy ostatniego parametru metody?Czy parametry końcowe mogą być w pewien sposób kwalifikowane do rozwiązywania konfliktów nazw z anonimowymi członkami klasy?

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(); 
     } 
    }; 
} 

Oczywiście bez wezwania doSomethingThatReassignsBar, byś nie potrzebował Bar członkiem i tak dalej. W takim przypadku prostą poprawką jest zmiana final Bar bar na coś podobnego do final Bar startBar, a następnie przypisanie jest w porządku. Ale z ciekawości można jednoznacznie odnieść się do final Bar (podobnie jak w przypadku Super.this)?

+6

"Dlaczego robisz to, co jest z tobą nie tak?" :) – jpm

+0

To nie jest tak naganne, jak można sobie wyobrazić. Stworzyłem program do tworzenia dokumentów i używałem wzorca gości do pisania przedmiotów, a w przypadku arkusza kalkulacyjnego po prostu przeglądałem komórki zaczynając od "startCell" (ostatniego parametru metody) i przechodząc przez nie za pomocą 'cell = cell.nextCell() ', gdzie komórka była komórką, do której należy funkcja ItemVisitor. –

Odpowiedz

7

Myślę, że odpowiedź na twoje pytanie brzmi "nie". Z Java Language Specification:

lokalna zmienna (§14.4), parametr formalny (§8.4.1), parametr wyjątek (§14.20) i miejscowy klasy (§14.3) można określić jedynie za pomocą prostego nazwę (§6.2), a nie nazwa kwalifikowana (§6.6).

Innymi słowy, nic nie można zastąpić SomeUnknownScopeQualifier z przykładowym kodem w celu złożenia oświadczenia przypisania w wewnętrznym klasy odnoszą się do formalnej nazwy parametru.

3

Myślę, że nie można tego zrobić. Zmień nazwę powiązanych zmiennych lub utwórz alias:

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

    // ... 
    }; 
} 
+0

Wydaje się to nie różnić od nazwy parametru metody "alias"? –

+2

Nazwa parametru metody może być dostępna dla narzędzi do uzupełniania kodu lub tym podobnych. Dlatego lepiej jest mieć własną dokumentację w publicznym interfejsie API i wewnętrznie używać odrębnej (choć możliwie tajemniczej) nazwy. – jpm

+0

To świetny punkt. Przegapiłem to, ponieważ jest to przydatna i wnikliwa odpowiedź. Odpowiedź Alexa przytacza jednak JLS i wydaje mi się, że powinienem to zaakceptować. –