Ответ @ 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);
Но неизменяемые классы безопаснее - я не могу придумать оправдания, чтобы сделать такой класс изменчивым.
Я действительно публикую это только потому, что сжимаюсь всякий раз, когда слышу анонимный внутренний класс - я видел много избыточного кода, который был «Обязательным», потому что первое, что сделал программист, это стало анонимным, когда он должен был использовать реальный класс и никогда переосмыслил свое решение.