2017-06-20 3 views
0

Salut, je lis du code dans un projet sur lequel je commence juste à travailler et je vois un code comme celui-ci, que je n'ai pas compris.passer l'interface à une classe qui implémente cette interface

public class A implements Ignite { 
    protected Ignite ignite; 
    ....... 
    protected void checkIgnite() { 
     ...... 
    } 

    @Override 
    public <K, V> IgniteCache<K, V> createCache(CacheConfiguration<K, V> cacheCfg) { 
     checkIgnite(); 
     return ignite.createCache(cacheCfg); 
    } 

} 

Je ne comprends pas la signification de cette classe. D'abord, cette classe A implémente l'interface Ignite. Alors pourquoi passer l'interface Ignite dans cette classe? Deuxièmement, pour la méthode createCache dans la classe A, elle renvoie ignite.createCache (cacheCfg), alors quelle est exactement l'implémentation de cette méthode?

Merci!

+0

Vous avez lu du code dans vos projets et ne le comprenez pas? Je pense que c'est votre projet? puis recherchez * classes wrapper * resp. * modèle de délégation * qui pourrait ajouter des fonctionnalités supplémentaires à celles existantes. – AKSW

+0

Je n'ai pas écrit cette classe. Je lis ce cours et j'essaie de comprendre ce que cela veut dire. – TryMyBest

+0

On dirait un motif de décorateur. Quelque chose de similaire est fait dans l'API IO de Java. Par exemple: Jetez un oeil à 'java.io.BufferedReader'. – anacron

Répondre

1

On dirait que quelqu'un a essayé de construire une méthode par défaut pour une interface avant Java 8. Lorsque A a un constructeur avec un argument Ignite alors vous pouvez le faire:

IgniteCache<> cache = new A(someIgnite).createCache(...); 

En Java 8, vous déplacer createCache() directement en tant que méthode par défaut à Ignite.

2

Votre classe A est à la fois une instance Ignite et contient une instance Ignite en tant que champ.
Il s'agit d'une classe wrapper conforme à une interface spécifique.

Il fournit un moyen de réutiliser une instance Ignite (qui peut être une instance d'une autre classe que A) tout en remplaçant certains de ses comportements.

Par exemple ici:

@Override 
public <K, V> IgniteCache<K, V> createCache(CacheConfiguration<K, V> cacheCfg) { 
    checkIgnite(); 
    return ignite.createCache(cacheCfg); 
} 

La mise en œuvre createCache() repose sur la createCache() de l'instance, mais enveloppé Ignite modifie son comportement en invoquant avant que la méthode checkIgnite() de la classe A.

0

Si je comprends bien, vous posez des questions sur IgniteSpringBean classe. C'est un wrapper pour l'intégration avec Spring. Cette classe encapsule la logique pour créer correctement et détruire l'instance d'Ignite. Aussi vérifier que bean a été correctement configuré sur les appels de méthodes.