Pergunta

Existe alguma maneira abreviada de definir e usar definições genéricas sem ter que repetir uma descrição genérica específica, de modo que, se houver uma mudança, eu não precise alterar todas as definições/usos, embora a base de código, por exemplo, seja algo assim possível:

Typedef myGenDef = < Object1, Object2 >;

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

for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}
Foi útil?

Solução

Aí está o antipadrão pseudo-typedef...

class StringList extends ArrayList<String> { }

Coisa boa, beba!;-)

Como observa o artigo, essa técnica tem alguns problemas sérios, principalmente porque esse "typedef" é na verdade uma classe separada e, portanto, não pode ser usado de forma intercambiável com o tipo que ela estende ou com outros tipos definidos de forma semelhante.

Outras dicas

Em um método genérico, você pode usar uma forma limitada de inferência de tipo para evitar algumas repetições.

Exemplo:se você tem a função

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

você pode usar:

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

em vez de:

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

Usar Padrão de fábrica para criação de Genéricos:

Amostra de método:

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

    }

O antipadrão pseudo-typedef mencionado por Shog9 funcionaria - embora não seja recomendado usar um ANTIPATTERN - mas não atende às suas intenções.O objetivo do pseudo-typedef é reduzir a confusão na declaração e melhorar a legibilidade.

O que você deseja é poder substituir um grupo de declarações genéricas por uma única transação.Acho que você tem que parar e pensar:"de que forma isso é valioso?".Quer dizer, não consigo pensar em um cenário em que você precisaria disso.Imagine a classe A:

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

Imagine agora que quero alterar o campo 'valores' para um Mapa.Por que existiriam tantos outros campos espalhados pelo código que precisam da mesma alteração?Já para as operações que utilizam 'valores' uma simples refatoração seria suficiente.

Não.Porém, groovy, uma linguagem JVM, é digitada dinamicamente e permite que você escreva:

def map = new HashMap<complicated generic expression>();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top