2017-10-11 21 views
0

나는 x, y, z의 3 가지 클래스를 가지고있다. x는 z의 메소드를 호출하는 y의 함수를 호출하고 메소드가 같은 메소드에서 실행 된 직후 x의 함수를 호출해야합니다. 이로 인해 종속성 주입을 수행하는 동안 순환 의존성이 끊임없이 발생합니다.Java에서 순환 의존성을 제거하는 방법은 무엇입니까?

이 문제를 해결하는 방법? 이것에서 벗어나는 방법?

EventService 클래스 (클래스 X)

private void callHandlers(ApplicationEvent event) { 
      ChecklistEventHandler handler = new ChecklistEventHandler(); 
      handler.handle(event); // here class Y is getting called. 
    } 

    public void createEvent(String type, String key, String creator, Map<String, Object> data) { 
     AccountInfo accountInfo = (AccountInfo) Http.Context.current().args.get(GtConstants.ACCOUNT_INFO); 
     String eventData = JacksonUtil.toString(data); 
     ApplicationEvent event = new ApplicationEvent(accountInfo.getSchemaName(), type, key, creator, eventData); 
     repository.save(event); 
     scheduleForProcessing(event,accountInfo); 
    } 

ChecklistEventHandler 클래스 (클래스 Y)

public void handle(ApplicationEvent event) { 
    ChecklistCriteria checklistCriteria = new ChecklistCriteria(); 
    checklistCriteria.setEventType(event.getType()); 
    checklistCriteria.setArchived(false); 
    taskManagementService.createChecklistInstancesAndTask(event, checklistCriteria); // here class Z is getting called. 
} 

TaskManagementService 클래스 (클래스 Z)이 의심을 지 웁니다

public void createChecklistInstancesAndTask(ApplicationEvent event, ChecklistCriteria checklistCriteria) { 
    List<Checklist> checkListCollection = getChecklistCollectionBasedOnEvent(checklistCriteria.getEventType(), 
      checklistCriteria.getArchived(), 
    LocalDate now = LocalDate.now(); 
    createChecklistInstancesAndTask(event, checkListCollection, now); 
     //here i am calling EventService class (class X)   eventService.createEvent(TaskConstants.EventType.COMPLETE_CHECKLIST_INSTANCE, 
String.valueOf(checklistInstance.getId()), TaskConstants.EventCreator.TASK_STATUS_UPDATOR, taskMap); 
} 

희망. 이제 X와 Y 클래스 함수를 대체하지 않고 어떻게 재 설계 할 수 있습니까? 클래스 z는 피할 수 있습니다.

+0

우리가 당신의 결함이 어디 있는지 알 수 있도록 정확한 코드를 보여주십시오. –

+1

순환 의존성이 없도록 코드를 재정렬하십시오. 순환 종속성을 갖는 것은 설계에서 무언가 잘못되었다는 신호이며 클래스 간의 결합이 너무 빡빡합니다. – Jesper

+0

@ OlivierGrégoire done. –

답변

0

순환 의존성을 해결하려면 종료 조건을 정의해야합니다. 자신이 정의한 재귀 적 경로가 아닌 다른 경로에서 코드가 실행되기 위해서는 어떤 조건을 만족해야하는지 스스로에게 물어보십시오. 따라서

private void A(){ 
    B()  
} 

private void B(){ 
    C(); 
} 

private void C(){ 
    if(conditionD){ 
      D(); 
    }else{ 
      A(); 
    } 
} 
+0

이 대답은 무한 재귀를 해결할 수 있지만 OP의 문제는 아닙니다. – DodgyCodeException

+0

@Chris Phillips 필자는 항상 함수 C에서 함수 A를 호출해야합니다. 요구 사항에 조건 D가 없습니다. –

+0

@DodgyCodeException 사실입니다. –