2016-02-16 5 views
4

Je suis désolé si mon titre est trop vague, mais je ne pouvais pas trouver mieux.Rénovation, Générique Type d'appel

J'ai un repos Api qui exposer un service de cette façon: /api/{type}/{id} 4 'type' et donc 4 types de classe qui sont retournés.

Toutes ces classes s'étend à partir des mêmes SuperClass

Mon problème est que je semble avoir toujours de nommer explicitement la classe retournée:

Call<Type1> call = apiInterface.get.... 
Call<Type2> call = apiInterface.get.... 

etc ...

donc pour l'instant Je le fais

SuperClass object = null; 
switch(type){ 
    case TYPE1: 
     Call<Type1> call = apiInterface.getType1(id); 
     call.enqueue(new Callback....{ 
      ....... 
      object = response.body() 
     } 
     break; 
    case TYPE2: 
     Call<Type2> call = apiInterface.getType2(id); 
     call.enqueue(new Callback....{ 
      ....... 
      object = response.body() 
     } 
     break; 
} 

qui se sent tout à fait faux.

Auriez-vous un moyen de le faire mieux, peut-être quelque chose avec des génériques?

Merci,

Répondre

0

Ce que je finaly fait est de créer une enveloppe pour toutes mes sous-classes dans ma classe Api:

public Call getCourseElement(Type type, String id){ 
    Call call = null; 
    switch (type) { 
     case TYPE1: 
      call = apiInterface.getType1(id); 
      break; 
     case TYPE2: 
      call = apiInterface.getType2(id); 
      break; 
     ... 
    } 
    return call; 
} 

et de l'utiliser de cette façon:

Call call = api.getCourseElement(type, id); 
      call.enqueue(new Callback() { 
       @Override 
       public void onResponse(Response response, Retrofit retrofit) { 
        SuperClass superObj = (SuperClass) response.body() 
        ........... 
       } 

       @Override 
       public void onFailure(Throwable t) { 
        .......... 
       } 
      }); 

J'ai quelques pensée d'avertissement non contrôlée, et j'ai encore l'interrupteur.

Une autre solution que j'ai envisagée est d'utiliser un TypeConverter personnalisé qui (à partir de la réponse json) créer un élément TYPE1/TYPE2 et le renvoyer dans un objet SuperClass. Mais je ne veux pas tester le JSON car il peut facilement changer.