@ sblundy ответ велик, но у анонимных внутренних классов есть два небольших недостатка: первичное из них состоит в том, что они, как правило, не могут быть повторно использованы, а вторичное - громоздкий синтаксис.
Приятно то, что его шаблон расширяется до полных классов без каких-либо изменений в основном классе (который выполняет вычисления).
Когда вы создаете экземпляр нового класса, вы можете передавать параметры в этот класс, которые могут выступать в качестве констант в вашем уравнении - поэтому, если один из ваших внутренних классов выглядит следующим образом:
f(x,y)=x*y
но иногда вам нужен такой, который:
f(x,y)=x*y*2
и, возможно, третье:
f(x,y)=x*y/2
вместо того, чтобы создавать два анонимных внутренних класса или добавлять параметр "passthrough", вы можете создать один класс ACTUAL, который вы создаете как:
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);
Было бы просто сохранить константу в классе и использовать ее в методе, указанном в интерфейсе.
Фактически, если ЗНАТЬ, что ваша функция не будет сохранена / повторно использована, вы можете сделать это:
InnerFunc f=new InnerFunc(1.0);// for the first
calculateUsing(f);
f.setConstant(2.0);
calculateUsing(f);
f.setConstant(0.5);
calculateUsing(f);
Но неизменяемые классы безопаснее - я не могу придумать оправдания, чтобы сделать такой класс изменчивым.
Я действительно публикую это, потому что я съеживаюсь всякий раз, когда слышу анонимный внутренний класс - я видел много избыточного кода, который был «Обязательным», потому что первое, что сделал программист, это стало анонимным, когда он должен был использовать реальный класс и никогда не переосмыслил свое решение.