Я выполняю рекурсию, как показано в комментарии ниже, используя строку callee.getExtendedCallees(requirement);
Я также добавляю текущий объект метода, который рассматриваю, в строке VisitedCallees.add(this);
, потому что я не хочу выполнять свою рекурсию для объекта, который уже был посещен.Давайте рассмотрим, что значение «this» равно 16 до применения рекурсии, поэтому VisitedCalleed
содержит 16 до применения рекурсии.Проблема заключается в том, что после применения рекурсии содержимое списка VisitedCallees
изменяется автоматически и больше не содержит метод 16, но теперь содержит новый метод, к которому была применена рекурсия (callee-новое значение «this»), который имеет идентификатор15 в этом случае.Таким образом, VisitedCallees
больше не содержит 16, а содержит 15 после применения рекурсии, что означает, что я больше не могу входить в оператор if.Я хочу, чтобы VisitedCallees
содержал 16 даже после рекурсии, и я не хочу, чтобы содержимое VisitedCallees
автоматически изменялось.Как я могу избежать этого и не допустить этого?
public MethodList getExtendedCallees(Requirement requirement) throws
CloneNotSupportedException {
if(this.FirstTimeCallees==false && !VisitedCallees.contains(this) && AlgoFinal.RecursiveDescent==true) {
//ADD VISITED CALLEES
VisitedCallees.add(this);
MethodList childrenCallees= new MethodList();
for(Method callee: this.Callees) {
if(!callee.Owner.ID.equals(this.Owner.ID)) {
ExtendedCallees.add(callee);
}else {
//RECURSION
callee.getExtendedCallees(requirement);
}
}
this.FirstTimeCallees=true;
ExtendedCallees=RemoveDuplicates(ExtendedCallees);
}
}