Java анонимные классы действительно очень многословны.Помимо огромного количества шаблонов, которые вам нужны только для их определения, некоторые из проектных решений Java означают, что многие общие задачи гораздо более многословны, чем в других языках.Например, импорт изменяемых значений в замыкание - трудная задача в Java.
По сути, Java не поддерживает значения вверх;вместо этого они моделируются путем передачи их (по значению) в класс через невидимые параметры в конструктор класса.Поскольку они передаются по значению, их изменение внутри класса не повлияет на копию в методе, который создал класс, поэтому компилятор заставляет вас объявить их окончательно, чтобы не запутаться.Например:
Runnable function()
{
final int i = 4;
return new Runnable()
{
public void run()
{
System.out.println("i="+i);
// can't modify i here
}
}
}
В тех случаях, когда вам нужно необходимо изменить переменную, например, почти во всех случаях, когда замыкания будут полезны, вы должны обмануть:
Runnable function()
{
final int[] i = new int[1];
i[0] = 4;
return new Runnable()
{
public void run()
{
System.out.println("i="+i[0]);
i[0] = i[0] + 1;
}
}
}
Здесь i
сам по-прежнему неизменен, но, поскольку он указывает на изменяемый объект, я могу изменить содержимое объекта.(Естественно, в реальной жизни я бы использовал класс, а не массив, потому что использование массивов действительно ужасно. И это делает его даже более многословным.)
Я понимаю, что следующийРелиз Java будет иметь синтаксический сахар, чтобы упростить все это, но сейчас программирование на основе замыканий довольно громоздко в Java.Я нахожу, что зачастую проще изменить логику, чтобы не использовать замыкания, просто чтобы я оставил количество используемого кода достаточно маленьким, чтобы быть понятным.