2017-10-11 12 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égoiredone。 –

答えて

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それは本当です。 –

関連する問題