2010-01-03 2 views
3

필자는 본질적으로 똑같은 두 가지 방법을 사용합니다. 유형이 다를뿐입니다. 이 기능을 일부 일반적인 메서드로 추상화하고 싶은데 C#에서 대리자를 사용하여 쉽게 수행 할 수 있다고 생각하지만 Java에서 이에 해당하는 기능을 알지 못합니다. 저는 여기에 두 가지 방법을 보여주고 있습니다 만, 여러 가지 (8 가지) 서로 다른 makeWhateverRequest 스타일 방법이 있습니다. 여기 내 방법은 다음과 같습니다 (각 방법의 첫 번째 행에서와 같이) UserString 걸릴 것 몇 가지 대표와 같은 일이있을 수 있다면Java에서 두 가지 메소드의 코드를 추상화 할 수 있습니까?

public State makeGetRequest(User user, String name) { 
    Get request = Builder.getGetRequest(user, name); 
    GetResponse response = service.get(request); 
    return ResponseTypeFactory.getResponseType(response); 
} 

public State makePutRequest(User user, String name) { 
    Put request = Builder.getPutRequest(user, name); 
    PutResponse response = service.put(request); 
    return ResponseTypeFactory.getResponseType(response); 
} 

, 즉 일반적인 방법 abstractable 그 라인을 만들 것 . 그러나 첫 번째 줄은 다른 값 (즉, Get 또는 Put 중 하나의 인스턴스)을 반환하며이 값은 두 번째 줄에서 사용됩니다. 각 메서드의 마지막 줄은 이미 동일하며 다형성을 사용하여 호출 할 getResponseType 버전을 확인합니다.

한 가지 어려움은 다른 방법을 호출해야하는 각 방법의 두 번째 줄에 있습니다. 아마도 나는 GetPut이 구현 된 인터페이스를 가질 수 있습니다. 그런 다음 인터페이스의 인스턴스를 사용하는 대리자와 같은 것을 필요로합니다. 그러면 GetResponsePutResponse 모두 다른 인터페이스를 구현할 수 있으며 해당 인터페이스의 인스턴스를 사용하는 getResponseType이 있는지 확인할 수 있습니다.

GetPut은 공통 기본 클래스 인 Request을 상속합니다. GetResponsePutResponse은 공통 기본 클래스 인 Response에서 상속됩니다. 아마도 기본 클래스를 추상화 한 다음 다른 인터페이스를 사용하는 대신 추상 추상 클래스의 인스턴스를 필요로하는 메소드 만 가질 수 있습니다.

저는 Java에 익숙하지 않아서 C#에서 할 일을 수행하는 것과 동일한 방법을 알지 못합니다. 도와 주셔서 감사합니다. 편집

:

IRequest    IResponse 
|  \    |  \ 
Get Put  GetResponse PutResponse 

그때 나는이 방법을 필요 : 여기 무엇을위한 인터페이스가 필요할 수 있습니다 내 생각이다

Builder.getRequest(User, String) 
=> IRequest 

service.getPut(IRequest) 
=> IResponse 

ResponseTypeFactory.getResponseType(IResponse) 
=> State 
+1

GET? 놓다? 물론 javax.servlet.http 패키지에 이미 존재하는 것을 재현하고 있습니까? – duffymo

답변

2

내가 좋은 방법이라고 생각하지 않습니다 자바로 당신이 가지고있는 것을 향상 시키십시오. 인터페이스로 뭔가를 할 수는 있지만 좀더 장황 할 것입니다. 당신의 방법이 실제로 당신이 가지고있는 것을 고수 할 때마다 오직 3 라인 만 있다면. 코드가 명확하고 복제가 최소화되어 있습니다.

+0

+1이 두 개의 3 줄을 가지고있는 것은 나에게 잘 고려 된 것 같습니다. – akuhn

1

Java는 일반적으로 단일 메소드 인터페이스와 익명 내부 클래스를 대리자와 동일하게 사용하지만 게시 한 예제는 너무 자세하게 표시됩니다.

코드를 조금 더 일반화하려는 경우 편집이 답변입니다. Get 또는 Put이 필요한지 여부를 나타내는 매개 변수를 가져 오도록 Builder.getRequest 메소드를 변경해야합니다 ('user'또는 'name'매개 변수에서 추론 할 수있는 경우 제외).

관련이없고 잠재적으로 논란이되는 메모에서 Builder 및 ResponseTypeFactory에 정적 메서드 대신 Dependency Injection을 사용하는 것이 좋습니다.

0

enumswitch 문을 사용할 수도 있습니다.

기본 예제 :

public enum RequestMethod { GET, PUT /* Add remaining here */ }; 

public State makeRequest(RequestMethod method, User user, String name) { 
    Object response; 
    switch (method) { 
     case GET: 
      response = service.get(Builder.getGetRequest(user, name)); 
      break; 
     case PUT: 
      response = service.put(Builder.getPutRequest(user, name)); 
      break; 
     // Add remaining cases here. 
    } 
    return ResponseTypeFactory.getResponseType(response); 
} 
0

난 반사를 사용하여 Java에서 콜백/위임 지원을 시행하고있다. 세부 정보 및 작업 소스는 available on my website입니다. 이것은 당신이하려는 일에 잘 어울릴 것입니다.

관련 문제