Search
Write a publication
Pull to refresh

Вложенные методы в 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);
  }
};}

Кроме рекурсивного случая рассмотренного выше, прием можно использовать для повышения читаемости кода: достаточно сгруппировать логически связанные участки кода как «вложенные» методы. В этом случае эффект от использования пропорционален числу таких методов.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.