2017-06-20 3 views
2

J'ai une classe abstraite avec une seule méthode abstraite; et un certain nombre de classes d'implémentation (environ 6).Manière élégante d'implémenter la classe abstraite

La méthode renvoie un objet qui "nécessite" deux paramètres.

Cependant, dans certains cas, un seul des deux paramètres est requis.

Y a-t-il une manière élégante de mettre en application ce cas? (Au lieu de retour ce paramètre vide)

public class NormResult { 
    protected List<String> normWords; 
    protected List<String> unNormWords; 

    public NormResult(List<String> normWords,List<String> unNormWords) { 
     this.normWords = normWords; 
     this.unNormWords = unNormWords; 
    } 

    public NormResult(List<String> normWords) { 
     this.normWords = normWords; 
     this.unNormWords = Collections.emptyList(); 
    } 
} 

public abstract class AbstractNormalizer { 
    protected abstract List<NormResult> doNorm(); 
} 

public class FirstNormImpl extends AbstractNormalizer { 
    protected List<NormResult> doNorm() { 
     List<String> normWords = new ArrayList<>(5); 
     List<String> unNormWords = new ArrayList<>(7); 

     NormResult result = new NormResult(normWords, unNormWords); 
     return result;  
    } 
} 

public class SecondNormImpl extends AbstractNormalizer { 
    protected List<NormResult> doNorm() { 
     List<String> normWords = new ArrayList<>(8);  
     NormResult result = new NormResult(normWords); 
     return result; 
    } 
} 
+0

Personnellement, je remplacerais 'Collections.emptyList()' par 'null', mais en dehors de cela, je ne vois aucun problème dans cette approche. – domsson

+1

pourquoi faites-vous ** résultat de retour; ** quand vous devriez retourner une liste ?? –

+0

votre code ne compile pas –

Répondre

2

si vous faites cela aux membres finaux:

protected final List<String> normWords; 
protected final List<String> unNormWords; 

puis dans le constructeur vous devez les initialiser à la fois ... vous pouvez définir un collection vide ou une référence null celui que vous n'avez pas/besoin

et votre constructeur surchargé peut ressembler à:

public NormResult(List<String> normWords, List<String> unNormWords) { 
    this.normWords = normWords; 
    this.unNormWords = unNormWords; 
} 

public NormResult(List<String> normWords) { 
    this(normWords, Collections.emptyList()); 
} 
+0

Je pensais peut-être ajouter une autre classe abstraite et seules les classes qui ont le second paramètre l'implémenteront. – userit1985

2

Les deux changements que je ferais:

  • Faire les champs finale
  • utilisation constructeur télescopage

comme dans:

public NormResult(List<String> normWords) { 
    this(normWords(), Collections.emptyList()); 
} 

pour éviter même si simple code » duplication "d'assigner des valeurs deux fois.

Au-delà de cela; Je suis d'accord avec les commentaires; cette approche semble raisonnable.

+0

[OT]: Ü-krass !!, Danke! –

+0

J'ai pensé que peut-être ajouter une autre classe abstraite et seulement les classes qui ont le deuxième paramètre l'implémenteront. – userit1985

+0

Cela pourrait être une option. Chose est: de telles décisions sont difficiles à faire sans connaître tous les détails. Nous ne pouvons pas vous dire le modèle optimal qui fonctionne le mieux pour toutes vos exigences. Nous pouvons seulement donner des conseils; et c'est ce que nous avons essayé ;-) – GhostCat