2013-07-16 3 views
2

객체로 디코딩 할 때 Json으로 인코딩 된 객체를 수신하는 Java 응용 프로그램을 작성합니다. 해당 객체에 적절한 관련 함수를 실행해야합니다. .if를 사용하는 대신 객체 유형별로 함수를 실행합니다.

저는 50 개의 개체를 가지고 있고 각 개체마다 함수를 실행하고 해당 개체의 기능을 전달해야합니다. 이는 내 코드에 5if else 문장이 있음을 의미합니다.

google-gson을 사용하여 json 문자열을 개체로 다시 디코딩합니다.

Gson gson = new Gson(); 
    Packet packet = (Packet) gson.fromJson(msg, cls); 

다음 나는 등

if (packet instanceof FooVO) { 
      func1(packet); 
    } else if (packet instanceof BarVO) { 
      func2(packet); 
    } 
    ... 

하고 있습니다 ... 편지

가 나는 경우 다음을 단축 할 수있는 방법이 자바 그래서 궁금하네요에서 해당 전문가가 아니에요/else 문을 사용하고 어떻게 든 객체 유형을 기반으로하는 함수를 반환하고 객체의 반환 유형을 기반으로 함수를 호출하는 클래스를 만듭니다.

내 코드에서 여러 번 사용하면 저를 구할 수있는 방법입니다!

감사합니다.

+0

패킷은 다른 모든 클래스가 상속하는 추상 클래스입니다. – ufk

+0

패킷이 웁니다. – ufk

답변

3

이상적으로 당신은 당신이 RunAfterDeserialize에 개체를 캐스팅하고 runAfterDeserialize 방법을 실행할 수 있도록 모든 50 개 개체의 클래스가하는 runAfterDeserialize 방법으로 공통 RunAfterDeserialize 인터페이스를 구현 가질 수있을 것입니다. 이 없다면

, 당신이있어 오십 개 다른 개체 유형 (예를 들어 FooVORunAfterDeserialize, BarVORunAfterDeserialize)에 해당하는 추상 RunAfterDeserialize 클래스를 생성하고 자신의 runAfterDeserialize 방법의 구현과 오십 개 서브 클래스를 만들 수 있습니다. 이제 Map<Class, RunAfterDeserialize>을 작성하십시오. 여기에서 50 개의 오브젝트에 대해 object.getClass()을 통해 키를 얻습니다. 당신이 당신의 처리 코드는 다양한 Packet 구현에서 분리하려면 다음

Map<Class, RunAfterDeserialize> map; 
Packet packet = (Packet) gson.fromJson(msg, cls); 
map.get(packet.getClass()).runAfterDeserialize(packet); 
6

가장 쉬운 방법은 가능한 모든 클래스가 동일한 인터페이스를 구현하고 abstract 메서드를 정의하는 것입니다. Json에서 객체를 읽은 다음 packet.func();을 호출하고 구현 세부 사항을 다른 클래스 자체로 남겨두면됩니다.

귀하의 의견에서 언급했듯이이 공통 기본 클래스가 이미 있으므로 Packet 클래스에 abstract 메서드를 정의 할 수 있습니다.

1

그 방법이 인터페이스 method()과 그 인터페이스의 메소드를 구현하는 다른 모든 클래스를 가질 수 있다고 생각합니다. 그런 다음 JSON에서 객체를 얻으면 해당 메소드를 packet.method()으로 호출 할 수 있습니다. 각 구현 클래스는 고유 한 방식으로 메서드를 재정의합니다.

1

에 적절한 방법을 실행할 수 있으며, visitor pattern은 당신이 찾고있는 것입니다.

관련 문제