2011-10-23 3 views
3

"핸들러"에서 모듈을 분리하기 위해 리플렉션을 오래 사용해 왔습니다.어떻게 반사를 guice로 바꿀 수 있습니까?

내가 코드 이런 식으로 구조화되어 기본이 내 코드에서 나중에 그런

static enum AnimalHandlers { 
    Dog(Dog.class), 
    Cat(Cat.class); 

    private final Class c; 

    AnimalHandlers(Class class) 
    { 
    this.c=class; 
    } 

    public Class getAnimalHandler() 
    { 
    return c; 
    } 
} 

를, I는 입력으로 "동물"열거를 받아 반사 (즉, 그것은 도착를 사용하는 방법을 열거 형의 클래스)를 호출하고 "newInstance"를 호출하여 필요한 처리기를 호출합니다.

나는 해결책이 Guice에게 더 깔끔할 것이라고 생각한다. enum/reflection을 없애고 guice를 사용하여 도메인 제어 논리 처리기로 제어 모듈을 "수화"할 수 있습니까?

+1

예제가 실제 코드보다 단순해질 수 있지만,이 방법은 단순히 'new' 만 사용하는 것이 아니라 구조화 된 것입니다. 왜 반사를 사용합니까? – aparker42

+0

왜냐하면 .... 동물들은 다른 유형을 가지고 있다고 가정하고, 그것들의 큰 목록은 다른 핸들러에게 제어를 전달하는 클래스로 보내집니다. 처리 할 동물의 유형에 따라 if 문이 필요합니다 (블록에 여러 개의 새로운 문이 포함 된 큰 블록이 필요하므로 동물을 통해 반복되는 논리를 동물 자체에 연결하므로 유지 관리가 불가능한 시스템으로 이어진다). 여러 개발자가 쉽게 확장 할 수 없습니다 .... 그리고 테스트하기 어려운 js – jayunit100

+0

솔직히 말하면, 열거 기반 솔루션이 그렇게 나쁘지는 않다고 생각합니다. 아마도 문제의 종류에 따라 쉽게 사용할 수있는 패턴이있을 것입니다 하지만 공통 디자인 패턴 중 하나를 찾지 못했습니다. 매번 새로운 핸들러가 필요합니까? 핸들러 클래스를 상태 비 저장으로 만들 수있는 경우 모든 열거 형 상수에 대해 하나의 인스턴스를 가질 수 있습니다. –

답변

2

를 사용하고 각 가능한 AnimalEnum 값에 대한 바인딩을 정의 할 수 있습니다.

+0

흠 ... 나는이 질문에 완전히 대답하지 않는다는 것을 깨달았다. 열거 형을 바꾸기를 원하기 때문에 - 나는 필요 없다. - 수업 목록이 필요하고, guice가 나를 위해 추악한 반성 작업을하기를 바란다. 그게 가능하다 /> – jayunit100

+0

그럼 내가 원하는 것을 완벽하게 이해하는지 모르겠다. MultiBinder 를 사용할 수도 있지만 사용할 핸들러를 어떻게 알 수 있습니까? 명확한 유스 케이스를 사용하여 질문을 명확히하거나 더 나은 방법으로 새로운 질문을해야합니다. – jfpoilpret

2

여기에는 더 좋은 패턴이 있어야한다고 생각합니다. 나는 조금 혼란 스럽다. 단지 핸들러와의 enum 인터페이스 인 Animal이 있지만 몇 가지 일반적인 제안을하고 아마 하나는 붙어있을 것이다.

  • Animal 열거 형에 처리기를 정의 할 방법이없고 클래스를 분리하려고한다고 가정합니다. 벌금.
  • 핸들러가 Animal.setHandler(...)으로 등록 될 수 있습니까? 그러면 개 처리기를 얻으려면 Animal.Dog.getHandler()으로 전화하면됩니다.
  • 나는 어떤 종류의 AnimalHandlerMapper도 좋을 것이라고 @jfpoilpret에 동의합니다. 나는 그것이 마커 인터페이스 일지라도 공통 인터페이스가 가능하다고 가정한다.

코드 :

private static Map<Animal, AnimalHandler> handlerMap 
    = new HashMap<Animal, AnimalHandler>(); 
static { 
    Dog dog = new Dog(); 
    handlerMap.put(Animal.Dog, dog); 
    // we use the same handler twice here 
    handlerMap.put(Animal.Wolf, dog); 
    handlerMap.put(Animal.Cat, new Cat()); 
    // do a Animal.values loop at the end to verify that everyone has a handler 
} 

public static AnimalHandler getHandler(Animal animal) { 
    return handlerMap.get(animal); 
} 
  • 어떤 이유로 나는이 같은 일을하지만 핸들러 공장을 할 것 핸들러의 인스턴스를 사용할 수없는 경우

    . 그래서 handlerMap.get(animal).create(animal) 또는 그와 같은 전화를했습니다. 이는 리플렉션을 사용하는 것보다 훨씬 더 깨끗합니다.
  • Guice가 Spring과 어떻게 비교되는지는 잘 모르겠지만, 봄철에 처리기 bean을 인스턴스화하고 AnimalHandlerMapper으로 등록하면 완전히 분리됩니다.

희망이 도움이됩니다.

관련 문제