Question

Existe-t-il un moyen abrégé de définir et d'utiliser des définitions génériques sans avoir à répéter une description générique particulière, de sorte que s'il y a un changement, je n'ai pas besoin de modifier toutes les définitions/usages, même si la base de code, par exemple, est quelque chose comme ceci possible :

Typedef myGenDef = < Object1, Object2 >;

HashMap< myGenDef > hm = new HashMap< myGenDef >();

for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}
Était-ce utile?

La solution

Il y a le anti-modèle pseudo-typedef...

class StringList extends ArrayList<String> { }

Bonne chose, buvez !;-)

Comme le note l'article, cette technique présente de sérieux problèmes, principalement le fait que ce "typedef" est en fait une classe distincte et ne peut donc pas être utilisé de manière interchangeable avec le type qu'il étend ou avec d'autres types définis de manière similaire.

Autres conseils

Dans une méthode générique, vous pouvez utiliser une forme limitée d’inférence de type pour éviter certaines répétitions.

Exemple:si tu as la fonction

    <K, V> Map<K, V> getSomething() {
        //...
    }

vous pouvez utiliser:

final Map<String, Object> something = getsomething();

au lieu de:

final Map<String, Object> something = this.<String, Object>getsomething();

Utiliser Modèle d'usine pour la création de génériques :

Exemple de méthode :

public Map<String, Integer> createGenMap(){
        return new HashMap<String,Integer>();

    }

L'anti-modèle pseudo-typedef mentionné par Shog9 fonctionnerait - bien qu'il ne soit pas recommandé d'utiliser un ANTIPATTERN - mais il ne répond pas à vos intentions.Le but du pseudo-typedef est de réduire l'encombrement dans la déclaration et d'améliorer la lisibilité.

Ce que vous souhaitez, c'est pouvoir remplacer un groupe de déclarations de génériques par un seul trade.Je pense qu'il faut s'arrêter et réfléchir :"En quoi est-ce précieux?".Je veux dire, je ne peux pas penser à un scénario où vous auriez besoin de ça.Imaginez la classe A :

class A {
     private Map<String, Integer> values = new HashMap<String, Integer>();
}

Imaginez maintenant que je souhaite changer le champ « valeurs » en carte.Pourquoi existerait-il de nombreux autres champs dispersés dans le code qui nécessitent le même changement ?Quant aux opérations qui utilisent des « valeurs », une simple refactorisation suffirait.

Non.Cependant, groovy, un langage JVM, est typé dynamiquement et vous permet d'écrire :

def map = new HashMap<complicated generic expression>();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top