Odpowiedź @ sblundy jest świetna, ale anonimowe klasy wewnętrzne mają dwie małe wady, z których pierwszą jest to, że nie nadają się do ponownego użycia, a wtórna to nieporęczna składnia.
Zaletą jest to, że jego wzór rozszerza się na pełne klasy bez żadnych zmian w klasie głównej (tej, która wykonuje obliczenia).
Kiedy tworzysz nową klasę, możesz przekazać parametry do tej klasy, która może działać jako stałe w twoim równaniu - więc jeśli jedna z twoich klas wewnętrznych wygląda tak:
f(x,y)=x*y
ale czasami potrzebujesz takiego, który jest:
f(x,y)=x*y*2
a może trzecia to:
f(x,y)=x*y/2
zamiast tworzyć dwie anonimowe klasy wewnętrzne lub dodawać parametr „przejście”, możesz utworzyć jedną RZECZYWISTĄ klasę, którą tworzysz jako:
InnerFunc f=new InnerFunc(1.0);// for the first
calculateUsing(f);
f=new InnerFunc(2.0);// for the second
calculateUsing(f);
f=new InnerFunc(0.5);// for the third
calculateUsing(f);
Po prostu zapisałby stałą w klasie i używałby jej w metodzie określonej w interfejsie.
W rzeczywistości, jeśli WIESZ, że twoja funkcja nie zostanie zapisana / ponownie użyta, możesz to zrobić:
InnerFunc f=new InnerFunc(1.0);// for the first
calculateUsing(f);
f.setConstant(2.0);
calculateUsing(f);
f.setConstant(0.5);
calculateUsing(f);
Ale niezmienne klasy są bezpieczniejsze - nie mogę znaleźć uzasadnienia, aby uczynić taką klasę zmienną.
Naprawdę publikuję to tylko dlatego, że wzdrygam się za każdym razem, gdy słyszę anonimową klasę wewnętrzną - widziałem dużo zbędnego kodu, który był „wymagany”, ponieważ pierwszą rzeczą, którą zrobił programista, był anonimowy, gdy powinien był użyć prawdziwej klasy i nigdy przemyślał swoją decyzję.