2013-10-13 3 views
1

나는 꽤 전형적인 질문이 있습니다.메소드의 매개 변수와 다른 매개 변수가있는 Java 클래스

public TaskListDatabases getTaskListDatabases (int mode) { 
    switch (mode) { 
     case (MODE_NORMAL): 
      if (taskListDatabases == null) { 
       taskListDatabases = new TaskListDatabases(app); // 1st place 
      } 
      break; 
     case (MODE_FORCE_RERUN): 
      if (taskListDatabases == null) { 
       taskListDatabases = new TaskListDatabases(app); // 2nd place 
      } else { 
       if (taskListDatabases.getStatus() == AsyncTask.Status.FINISHED) 
        taskListDatabases = new TaskListDatabases(app); // 3rd place 
      } 
      break; 
    } 
    return taskListDatabases; 
} 

가 지금은 하나 이상하지만 (주석으로 표시) 실제 개체 건설 장소에서 다른 유사 네 다른 함수를 만들 싶습니다 내 응용 프로그램에서 나는 다음과 같은 코드가 있습니다.

대신 new TaskListDatabases(app) 1 일에서 나는 3 new Task (app, String, String, String)에, 2 new Task (app, String, int)에, new Task (app, int, int)을하고 싶은 ....

모든 나머지는 동일 할 것이다. "매개 변수"부분을 가지고 하나의 함수를 만들 수있는 기회가 있는지 궁금합니다. new TaskListDatabases(app). 클래스의 질문 일 뿐이라면 "클래스 매개 변수"를 갖기 때문에 문제가되지 않습니다. 그러나 여기에서는 각 클래스도 생성자 매개 변수가 다릅니다.

아이디어가 있으십니까?

+2

Google은 "공장"패턴을 사용합니다. – Dirk

+0

TaskListDatabases의 인스턴스를 param으로 가져 오지 않는 이유는 무엇입니까? – mash

+0

[[1] (http://www.youtube.com/watch?v=ub0DXaeV6hA)) [[2] (http://www.youtube.com/watch?v=xbjAsdAK4xQ)]를 살펴보십시오. –

답변

0

abstract factoryanonymouscallback으로 구현되며 facade 뒤에 있습니다. 혼란스러워? 희망이 후에되지 않습니다 :

익명 콜백 인터페이스를 정의합니다

private interface TaskFactory { 
    Task create(); 
} 

리팩터링 기본 방법을 각각의 목적을 위해 외관 방법을 만드는 공장 그리고

private Task getTask (int mode, TaskFactory factory) { 
    switch (mode) { 
     case MODE_NORMAL: 
      if (taskListDatabases == null) { 
       taskListDatabases = factory.create(); 
      } 
      break; 
     case (MODE_FORCE_RERUN): 
      if (taskListDatabases == null) { 
       taskListDatabases = factory.create(); 
      } else { 
       if (taskListDatabases.getStatus() == AsyncTask.Status.FINISHED) 
        taskListDatabases = factory.create(); 
      } 
      break; 
    } 
    return taskListDatabases; 
} 

을 사용 :

public Task getTaskListDatabases(int mode) { 
    return getTask(mode, 
     new TaskFactory() { 
      Task create() { 
       return new TaskListDatabases(app); 
      } 
     } 
    } 
} 

public Task getTaskOther(int mode) { 
    return getTask(mode, 
     new TaskFactory() { 
      Task create() { 
       return new Task(app, "foo", 7; // eg 
      } 
     } 
    } 
} 

// etc for other Task flavours 
+0

꽤 복잡해 보입니다. 그것을 분석 할 필요가.하지만 내 경우 public Task getTaskOther 메서드는 새 Task 생성자로 전송 될 더 많은 매개 변수 ex. (int, String, String)을가집니다. AbstractFactory에 어떤 영향을 미치는지 확인하십시오. – user2707175

+0

Google "value object"를 사용하고 더 간단한 경우에는 일부 필드가 null로 설정된 인스턴스 중 하나를 사용하십시오. – Bohemian

관련 문제