Domanda

Esiste un modo abbreviato per definire e utilizzare definizioni generiche senza dover continuare a ripetere una particolare descrizione generica in modo tale che se c'è un cambiamento non devo cambiare tutte le definizioni/usi anche se la base di codice, ad esempio, è qualcosa di simile possibile:

Typedef myGenDef = < Object1, Object2 >;

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

for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}
È stato utile?

Soluzione

C'è il antipattern pseudo-typedef...

class StringList extends ArrayList<String> { }

Roba buona, bevi!;-)

Come nota l'articolo, questa tecnica presenta alcuni problemi seri, principalmente il fatto che questo "typedef" è in realtà una classe separata e quindi non può essere utilizzata in modo intercambiabile né con il tipo che estende né con altri tipi definiti in modo simile.

Altri suggerimenti

In un metodo generico è possibile utilizzare una forma limitata di inferenza del tipo per evitare alcune ripetizioni.

Esempio:se hai la funzione

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

Puoi usare:

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

invece di:

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

Utilizzo Modello di fabbrica per la creazione di generici:

Esempio di metodo:

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

    }

L'antipattern pseudo-typedef menzionato da Shog9 funzionerebbe, anche se non è consigliabile utilizzare un ANTIPATTERN, ma non soddisfa le tue intenzioni.L'obiettivo di pseudo-typedef è ridurre la confusione nella dichiarazione e migliorare la leggibilità.

Ciò che si desidera è poter sostituire un gruppo di dichiarazioni di farmaci generici con un'unica operazione.Penso che devi fermarti e pensare:"in che senso ha valore?".Voglio dire, non riesco a pensare a uno scenario in cui avresti bisogno di questo.Immagina la classe A:

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

Immagina ora di voler cambiare il campo "valori" in una mappa.Perché dovrebbero esistere molti altri campi sparsi nel codice che necessitano della stessa modifica?Per quanto riguarda le operazioni che utilizzano 'valori' basterebbe un semplice refactoring.

NO.Tuttavia, groovy, un linguaggio JVM, è digitato dinamicamente e ti consente di scrivere:

def map = new HashMap<complicated generic expression>();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top