2017-01-05 18 views
1

У меня есть следующие 2 methods ниже.Решение Циклическая зависимость бесконечная петля с использованием счетчика?

В правильном случае использования cancelChildTree() звонит removeChildRelationsIfNecessary(), а затем переходит через мой код.

Однако для некоторых данных в моей базе данных существует circular dependency между родителями и детьми. Это приводит к тому, что 2 метода продолжают звонить друг другу в infinite loop.

Как я могу решить эту проблему? Мой план состоял в том, чтобы попытаться добавить counter, чтобы обнаружить, что произошел цикл infinite, - затем перейдите для этого отношения родительского дочернего элемента.

Метод 1:

private void cancelChildTree(Parent parent) { 
    removeChildRelationsIfNecessary(parent); 
    //Note that the 2 methods below never get called if the infinite loop occurs 
    otherMethod(); 
    anotherMethod(); 
} 

Метод 2:

private void removeChildRelationsIfNecessary(Parent parent) { 
    List<Child> childList = parent.getParentChildRelationship()); 
    for (Child child: childList { 
     cancelChildTree(child); 
    } 
    } 

ответ

1

Похоже, вы неоднократно вызывая cancelChildTree(Parent parent) на же объекта.

Если да, то что мешает вам использовать объект Set<Parent> для отслеживания родительских объектов, которые были предоставлены этому методу? Другими словами: вместо использования немого счетчика; почему бы вам не отслеживать те объекты, которые в настоящее время обрабатываются; чтобы избежать их обработки ?

+0

Я обновил свой код, извините, что это была старая версия, скопировать и вставить неправильную. – java123999

+0

Мое мнение заключалось в том, что вы все время вызываете этот метод на ** том же ** объекте. И когда я смотрю на ваше редактирование, это все еще похоже на это. Таким образом, я не получаю то, что вы пытаетесь сказать своим комментарием здесь. – GhostCat