2009-04-01 8 views
1

j'ai un code Java similaire à:Java génériques pour la politique comme alternative à la politique en passant dans le constructeur

public class Thing { 

    private IPolicy policy; 

    public Thing(IPolicy policy) { 
      this.policy = policy; 
    } 

    public void doSomething() { 
      this.policy.execute(); 
    } 
} 

Ma question est la suivante: est-il possible de le faire avec les médicaments génériques plutôt que de passer la politique du constructeur? Je pense que cela signifie que je veux finir comme

public class Thing<T extends IPolicy> 

mais je ne suis pas sur les médicaments génériques. Mes motivations sont: 1) il me semblerait plus logique que mon programme fasse partie du type et ne soit pas impliqué avec le constructeur (qui a d'autres choses à faire) et 2) I ' J'essaie d'apprendre les génériques.

+0

Vous venez du C++? (Les génériques Java ne sont pas des modèles C++.) En Java, vous utilisez généralement le polymorphisme standard [dynamique] de bog pour décrire le comportement et les génériques pour décrire les types paramétrés. Il peut être nécessaire de combiner les deux, alors que C++ peut s'en tirer avec des modèles seuls. –

Répondre

3

Je ne pense pas que cela ait beaucoup de sens. N'est-ce pas la politique elle-même que vous dépendez, plutôt que juste le type de la politique? Ne vas-tu pas vouloir poser les questions de politique (par exemple si oui ou non une action est autorisée)? Cela signifie que vous aurez besoin d'une instance de la politique - ce qui signifie qu'il est logique qu'elle soit transmise au constructeur. Les génériques conviennent lorsque vous voulez une API fortement typée dans laquelle une partie de l'API dépend d'un autre type, mais l'implémentation elle-même ne se soucie pas de son type (potentiellement avec certaines contraintes). L'API de collections est probablement l'exemple canonique - un List<T> ne se soucie pas de ce qu'est T, mais veut exposer une API fortement typée en termes de T. Je ne vois pas cela dans votre exemple de politique.

0

Ce que vous essayez de faire est de s'assurer qu'une chose a toujours une politique à savoir. Une chose ne peut pas exister avec une politique. Cela nécessite que le mécanisme du constructeur ou l'abstraction comme,

public abstract class Thing { 
    public abstract Policy getPolicy(); 
    public void doSomething() { 
     getPolicy().execute(); 
    } 
} 
0

Même la version générique ne serait pas éviter « passer la politique du constructeur » parce que Java génériques utilisent l'effacement de type . Vous pouvez cependant, mettre en œuvre le constructeur GenericThing(Class<T> clazz) mais c'est surpuissant:

public class GenericThing<T extends IPolicy> { 

    private T policy; 

    public GenericThing(Class<T> clazz) throws InstantiationException, IllegalAccessException { 
     policy = clazz.newInstance(); 
    } 

    public GenericThing(T policy) { 
     this.policy = policy; 
    } 

    public void doSomething() { 
     this.policy.execute(); 
    } 
} 

Je suis bien d'accord avec Jon answer. Vous ne profitez pas vraiment de cette situation fortement typée.

+0

Pourquoi la downvote? Ai-je tristé quelque chose de mal? S'il vous plaît, expliquez ... –

Questions connexes