2017-10-13 3 views
1

Apache Storm a une interface IBasicBolt avec une carte non typée.Implémentation d'une interface sans paramètre de type d'interface

//org.apache.storm.topology.IBasicBolt 
public interface IBasicBolt extends IComponent { 
    void prepare(Map stormConf, TopologyContext context); 
    ... 
} 

Je veux ajouter une carte dactylographiée dans ma classe abstraite,

public abstract class MyClass implements IBasicBolt { 
    @override 
    public void prepare(Map<String, Object> stormConf, TopologyContext context) { 
    } 
} 

Est-il possible de le faire sans ajouter <String, Object> à la classe de tempête?

Répondre

4

Le Adapter pattern est approprié pour ce type de situation, bien que dans votre cas d'utilisation, ce ne soit pas forcément ce que vous recherchez. Mais c'est un modèle qui mérite d'être connu et qui peut vous orienter dans la bonne direction.

intention

Convertir l'interface d'une classe dans une autre interface clients attendent. L'adaptateur permet aux classes de fonctionner ensemble qui ne pourraient pas autrement à cause d'interfaces incompatibles.

Exemple

considèrent donc l'interface cible, à savoir celui que vous souhaitez programmer à:

public interface IMyBasicBolt {  
    void prepare(Map<String, Object> stormConf, String other);  
} 

(Note: J'ai remplacé TopologyContext avec String pour simplifier) ​​

Vous peut ensuite créer une classe d'adaptateur qui implémente votre interface cible et délègue le comportement (composition) à une implémentation de IBoltBasic.

public class BasicBoltAdapter implements IMyBasicBolt { 

    private IBasicBolt basicBolt; 

    public BasicBoltAdapter(IBasicBolt basicBolt) { 
     this.basicBolt = basicBolt; 
    } 

    @Override 
    public void prepare(Map<String, Object> stormConf, String other) { 
     basicBolt.prepare(stormConf, other); 
    }  

} 

Exemple d'utilisation de l'adaptateur BasicBoltAdapter:

IBasicBolt basicBolt = new IBasicBolt() { 

    @Override 
    public void prepare(Map stormConf, String other) { 
     System.out.println(stormConf.toString() + " " + other); 
    } 
}; 
Map<String, Object> map = new HashMap<>(); 
map.put("MapKeyTest", new Object()); 
IMyBasicBolt myBasicBolt = new BasicBoltAdapter(basicBolt); 
myBasicBolt.prepare(map, "Test"); 

Il n'y a pas strictement nécessaire pour l'interface IMyBasicBolt (interface cible) dans votre cas. Mais il est généralement bon de programmer une interface si possible.