Задача заключалась в написании метода, который бы рекурсивно проверял внутреннюю структуру данных и возвращал ответ вызывающему. Очевидное решение будет таким:
Учитывая идиому локальности кода закрытый метод следовало бы перенести в validate(). Но на пути к совершенству встала суровая реальность — Java не поддерживает вложенные методы. Однако, существует неплохой обходной путь:
Если значение возвращать не нужно, то код будет короче:
Кроме рекурсивного случая рассмотренного выше, прием можно использовать для повышения читаемости кода: достаточно сгруппировать логически связанные участки кода как «вложенные» методы. В этом случае эффект от использования пропорционален числу таких методов.
boolean validate() {
return check(_struct);
}
private boolean check(Struct struct) {
if (!struct.valid()) return false;
for(Struct child : struct.children()) {
if (!check(child)) return false;
}
return true;
}
Учитывая идиому локальности кода закрытый метод следовало бы перенести в validate(). Но на пути к совершенству встала суровая реальность — Java не поддерживает вложенные методы. Однако, существует неплохой обходной путь:
boolean validate() {
return new Object() {
boolean check(Struct struct) {
if (!struct.valid()) return false;
for(Struct child : struct.children()) {
if (!check(child)) return false;
}
return true;
}
/* Здесь может быть любое количество вложенных методов… */
}.check(_struct);
}
Если значение возвращать не нужно, то код будет короче:
void foo() { new Object() {
{ bar(_struct); }
void bar(Struct struct) {
struct.makeMeFeelGood();
for(Struct child : struct.children()) bar(child);
}
};}
Кроме рекурсивного случая рассмотренного выше, прием можно использовать для повышения читаемости кода: достаточно сгруппировать логически связанные участки кода как «вложенные» методы. В этом случае эффект от использования пропорционален числу таких методов.