2012-12-14 2 views
0

Possible en double:
How to suppress Java compiler warnings for specific functionsEst-ce que le point d'avertissement de compilation est mauvais?

Je voudrais utiliser une carte pour mettre en œuvre le modèle de stratégie. Cependant, je ne peux pas trouver un moyen de le faire d'une manière qui fonctionne bien avec les génériques. Est-il possible de supprimer l'avertissement de compilation du code suivant sans modifier la fonctionnalité?

import java.util.HashMap; 
import java.util.Map; 

interface Event 
{ 
} 

interface EventProcessor<T extends Event> 
{ 
    public void handleEvent(T event); 
} 


class EventA implements Event 
{ 
} 

class EventB implements Event 
{ 
} 

class ProcessorA implements EventProcessor<EventA> 
{ 
    @Override 
    public void handleEvent(final EventA event) 
    { 
     System.out.println("Handling event type A"); 
    } 
} 

class ProcessorB implements EventProcessor<EventB> 
{ 
    @Override 
    public void handleEvent(final EventB event) 
    { 
     System.out.println("Handling event type B"); 
    } 
} 

class GenericEventProcessor 
{ 
    Map<Class<? extends Event>, EventProcessor> map = new HashMap<Class<? extends Event>, EventProcessor>(); 

    public GenericEventProcessor() 
    { 
     map.put(EventA.class, new ProcessorA()); 
     map.put(EventB.class, new ProcessorB()); 
    } 

    public void processEvent(Event event) 
    { 
     EventProcessor eventProcessor = map.get(event.getClass()); 

     //Java Warning: GenericEventProcessorTest.java uses unchecked or unsafe operations. 
     eventProcessor.handleEvent(event); 
    } 
} 

public class GenericEventProcessorTest 
{ 
    public static void main(String[] args) 
    { 
     EventA eventA = new EventA(); 
     EventB eventB = new EventB(); 

     GenericEventProcessor eventProcessor = new GenericEventProcessor(); 
     eventProcessor.processEvent(eventA); 
     eventProcessor.processEvent(eventB); 
    } 
} 

Edit: je l'ai dit, sans utiliser SuppressWarnings! Cela me dit normalement qu'il y a un problème avec ma conception et j'aimerais savoir si c'est le cas ici.

+1

Et quels avertissements le compilateur montre-t-il? – reporter

+0

J'ai édité le titre pour minimiser l'aspect avertissement de compilateur de cette question –

+0

@reporter - l'avertissement est commenté dans le code (pas énormément clair, j'apprécie) –

Répondre

0

Oui, ajouter

@SuppressWarnings("unchecked") 

à la méthode.

Le problème est que le compilateur ne peut pas déterminer que l'opération est sûre.

+0

Désolé j'aurais dû le dire, sans utiliser SuppressWarnings! Cela me dit normalement qu'il y a un problème avec ma conception et j'aimerais savoir si c'est le cas ici. –

+0

Ce n'est pas dans ce cas parce que vous essayez de faire quelque chose que le compilateur ne peut pas vérifier. Je ne crois pas qu'il existe une meilleure façon de concevoir ce que vous faites. Remarque: même les bibliothèques de collections ne se compilent pas sans ces avertissements. –

3

il semble actuellement à moi comme la carte est substituait pour le polymorphisme et correspond en fait à un contrôle de type ainsi:

if (event instanceof EventA) { 
} 
else if (event instanceof EventB) { 
} 
// etc... 

Puisque vous utilisez le type de l'événement pour déterminer le processeur d'événements correspondant, puis appeler à l'événement, pourquoi ne pas utiliser le visiteur ou le modèle à double expédition ainsi:

event.getEventProcessor().processEvent(event); 

de telle sorte que chaque événement comprend ce processeur événement correspond à via polymorphisme. Ce qui précède ne peut évidemment être effondré simplement:

event.process(); 

Il est beaucoup moins complexe et vous ne devez pas remplir votre carte pour chaque nouveau type d'événement. Je remarque que vous mettez en œuvre le modèle de stratégie, mais celui-ci semble en grande partie statique et lié par type. Je m'attendrais à ce que le modèle de stratégie substitue des implémentations différentes sur quelque chose autre qu'un type (par exemple une certaine config)

Questions connexes