Czy można przekazać parametry lub uzyskać dostęp do parametrów zewnętrznych do anonimowej klasy? Na przykład:
int myVariable = 1;
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// How would one access myVariable here?
}
});
Czy istnieje sposób, aby detektor uzyskał dostęp do myVariable lub został przekazany do myVariable bez tworzenia detektora jako rzeczywistej nazwanej klasy?
java
anonymous-class
Chwytak
źródło
źródło
final
zmiennych lokalnych z otaczającej metody.this
.Odpowiedzi:
Technicznie nie, ponieważ klasy anonimowe nie mogą mieć konstruktorów.
Jednak klasy mogą odwoływać się do zmiennych z zakresów zawierających. W przypadku klasy anonimowej mogą to być zmienne instancji z klas zawierających je lub zmienne lokalne, które są oznaczone jako końcowe.
edycja : Jak zauważył Peter, możesz również przekazać parametry do konstruktora nadklasy klasy anonimowej.
źródło
new ArrayList(10) { }
super()
i przed resztą rzeczywistego konstruktora.new someclass(){ fields; {initializer} fields; methods(){} }
. To coś w rodzaju statycznego inicjatora, ale bez słowa kluczowego static. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6Tak, przez dodanie metody inicjującej, która zwraca „this” i natychmiastowe wywołanie tej metody:
Nie jest wymagana deklaracja „końcowa”.
źródło
final
obiektu referencyjnego, aby móc uzyskać informacje na moich anonimowych zajęciach. Dziękuję za udostępnienie!init()
funkcja musi wrócićthis
? Tak naprawdę nie rozumiem składni.tak. możesz przechwycić zmienną, widoczną dla klasy wewnętrznej. jedynym ograniczeniem jest to, że musi być ostateczna
źródło
this
jest ostateczne.final
? Nie mogę znaleźć alternatywy. Może to wpłynąć na parametr pochodzenia, który ma byćfinal
.Lubię to:
źródło
To zrobi magię
źródło
Jak pokazano na http://www.coderanch.com/t/567294/java/java/declare-constructor-anonymous-class , możesz dodać inicjator instancji. Jest to blok, który nie ma nazwy i jest wykonywany jako pierwszy (tak jak konstruktor).
Wygląda na to, że są one również omówione w artykule Dlaczego inicjatory instancji Java? i czym różni się inicjator wystąpienia od konstruktora? omawia różnice od konstruktorów.
źródło
final
zmiennymi opisanymi przez aav, ale ta informacja nie została podana w tej odpowiedzi. Zdecydowanie najlepszą odpowiedzią jest ta, której udzielił Adam Mlodzinksi (teraz używam wyłącznie tego wzoru, koniec finałów!). Podtrzymuję mój komentarz, że to nie odpowiada na zadane pytanie.Moim rozwiązaniem jest użycie metody, która zwraca zaimplementowaną klasę anonimową. Do metody można przekazywać zwykłe argumenty, które są dostępne w klasie anonimowej.
Na przykład: (z jakiegoś kodu GWT do obsługi zmiany pola tekstowego):
W tym przykładzie do nowej anonimowej metody klasy będzie odwoływać się:
LUB , korzystając z wymagań PO:
źródło
Inni ludzie już odpowiedzieli, że klasy anonimowe mają dostęp tylko do zmiennych końcowych. Ale pozostawiają otwarte pytanie, jak zachować oryginalną zmienną jako nieostateczną. Adam Mlodziński podał rozwiązanie, ale jest dość rozdęty. Istnieje znacznie prostsze rozwiązanie tego problemu:
Jeśli nie chcesz
myVariable
być ostateczny, musisz umieścić go w nowym zakresie, w którym nie ma znaczenia, czy jest ostateczny.Adam Mlodziński nie robi nic więcej w swojej odpowiedzi, ale z dużo większym kodem.
źródło
init
metody. Mogę dodać jedną dodatkową linię kodu do mojego przykładu, aby mieć tę dodatkową zmienną. Jeśli jesteś wielkim fanem wzorów budowniczych, możesz z nich korzystać, ale w tym przypadku nie są one konieczne.final
rozwiązania zmiennego.Możesz używać zwykłych wyrażeń lambda („wyrażenia lambda mogą przechwytywać zmienne”)
lub nawet funkcja
Korzystanie z funkcji to świetny sposób na refaktoryzację dekoratorów i adapterów, patrz tutaj
Właśnie zacząłem się uczyć o lambdach, więc jeśli zauważysz błąd, napisz komentarz.
źródło
Prosty sposób na umieszczenie wartości w zmiennej zewnętrznej (nie należy do klasy anonymus) jest następujący!
W ten sam sposób, jeśli chcesz uzyskać wartość zmiennej zewnętrznej, możesz utworzyć metodę, która zwraca to, co chcesz!
źródło
Myślałem, że anonimowe klasy są w zasadzie podobne do lambd, ale z gorszą składnią ... okazuje się, że jest prawdą, ale składnia jest jeszcze gorsza i powoduje (co powinno być) lokalne zmienne wyciekające do klasy zawierającej.
Nie możesz uzyskać dostępu do żadnych zmiennych końcowych, przekształcając je w pola klasy nadrzędnej.
Na przykład
Berło:
klasa:
Nie wiem, czy załatwili to w Javie 8 (utknąłem w świecie EE i jeszcze nie mam 8), ale w C # wyglądałoby to tak:
Nie potrzebujesz też osobnego interfejsu w c # ... Tęsknię za tym! Uważam, że robię gorsze projekty w Javie i powtarzam się częściej, ponieważ ilość kodu + złożoność, którą trzeba dodać w Javie, aby ponownie użyć czegoś, jest gorsza niż zwykłe kopiowanie i wklejanie dużo czasu.
źródło