Victor Brendon Batista Nunes Willian Henrique Pereira Fontenele
Resumo: O abordado tema faz referencia ao Generics em Java, chamado tambm de programao genrica, que serve basicamente para determinar para o compilador qual tipo de classe deve ser interpretada.
Introduo O referente artigo tem por seu tema o "Generics em Java" utilizado para poupar o desenvolvedor de cdigos redundantes. Um tipo Genrico um tipo que possui um ou mais parmetros de tipo. Metodologia A presente pesquisa teve seu contedo inteiramente retirada da internet onde continha sites que hospedavam artigos, livros e contedos acerca do tema dito anteriormente. Para fins de poder utilizar as informaes contidas nesses sites, sem que ficasse a ideia de plagio ao final encontra-se a fonte das informaes utilizadas. Discusso Genricos so a facilidade de programao genrica que foram adicionados linguagem de programao Java, em 2004, dentro de J2SE 5.0. Eles permitem que "um tipo ou mtodo para operar em objetos de vrios tipos, proporcionando segurana tipo em tempo de compilao". Generics em java permitem tipos(Classes e interfaces) para ser parmetros na definio de classes, interfaces e mtodos. Muito parecido com os parmetros formais mais conhecidas usadas em declaraes de mtodos, parmetros de tipo fornecem uma maneira para que voc possa voltar a utilizar o mesmo cdigo com entradas diferentes. A diferena que as entradas para os parmetros formais so valores, enquanto as entradas para digitar os parmetros so tipos. O cdigo que usa os genricos tem muitas vantagens sobre o cdigo no genrica: Verificaes de tipo mais forte em tempo de compilao. Um compilador Java aplica forte verificao de tipo de cdigo e emite erros genricos se o cdigo viola tipo de segurana. Corrigindo erros em tempo de compilao mais fcil do que corrigir erros de execuo, o que pode ser difcil de encontrar. Ativando programadores para implementar algoritmos genricos. Usando os genricos, os programadores podem implementar algoritmos genricos que funcionam em colees de diferentes tipos, podem ser personalizados, e so seguros e mais fcil de ler tipo Tipos genricos Um tipo genrico uma classe genrica ou interface que parametrizado sobre tipos. A classe seguinte caixa ser modificado para demonstrar o conceito. A Caixa Classe Simples Comece examinando uma classe Caixa no genrico que opera em objetos de qualquer tipo. Ele s precisa fornecer dois mtodos: set, que adiciona um objeto para o caixa, e obter, que recupera-la: Caixa public class { object Object privado;
set public void (object Object) {this.object = objeto; } get public Object () {return objeto; } } Desde seus mtodos aceitar ou retornar um objeto, voc est livre para passar o que quiser, desde que no um dos tipos primitivos. No h nenhuma maneira de verificar, em tempo de compilao, como a classe usada. Uma parte do cdigo pode colocar um nmero inteiro na caixa e espera obter Integer s fora dele, enquanto outra parte do cdigo pode equivocadamente passar em um String, resultando em um erro de execuo. A verso genrica da classe Box A classe genrica definido com o seguinte formato: nome da classe <T1, T2, ..., Tn> {/ * ... * /} A seo de parmetro de tipo, delimitados por colchetes angulares (<>),segue o nome da classe. Ele especifica os parmetros de tipo (tambm chamados de variveis tipo) T1, T2, ..., e Tn. Para atualizar a classe Box para usar os genricos, voc cria uma declarao de tipo genrico, alterando o cdigo "Caixa public class" para "public class Box <T>". Isso introduz a varivel tipo T, que pode ser usado em qualquer lugar dentro da classe. Com esta mudana, a classe Caixa torna-se: / ** * Verso genrica da classe Caixa. * @ Param <T> o tipo do valor que est sendo encaixotado * / public class Box <T> { / / T significa "Type" privado T t;
public void set (T t) {this.t = t; } get T pblico () {return t; } } Como voc pode ver, todas as ocorrncias do objeto so substitudas por T.Uma varivel do tipo pode ser qualquer tipo no primitivo voc especificar: qualquer tipo de classe, qualquer tipo de interface, qualquer tipo de matriz, ou mesmo outro tipo de varivel. Esta mesma tcnica pode ser aplicada para criar interfaces genricas. Convenes de nomenclatura tipo de parmetro Por conveno, os nomes de tipo de parmetro, letras maisculas so individuais. Isto est em ntido contraste com as variveis de nomeao convenes que voc j conhece, e com razo: Sem esta conveno, seria difcil dizer a diferena entre uma varivel do tipo e uma classe comum ou nome da interface. Os nomes de parmetro de tipo mais comumente utilizados so: E - Elemento (usado extensivamente pelo Java Collections Framework) K - Chave N - Nmero T - Tipo V - Valor S, U, V, etc - 2, 3, 4 tipos Voc vai ver esses nomes usados em todo o API Java SE e no resto desta lio. Invocando e Instanciando um tipo genrico Para fazer referncia classe Box genrico a partir do seu cdigo, voc deve executar uma invocao de tipo genrico, que substitui T com algum valor concreto, como Integer: Box <Integer> integerBox; Voc pode pensar em um tipo de invocao genrica como sendo semelhante a uma invocao de mtodo comum, mas em vez de passar um argumento para um mtodo, voc est passando um argumento de tipo - Integer neste caso - para a prpria classe Caixa. Tipo de parmetro e tipo Argumento Terminologia: Muitos desenvolvedores usam os termos "tipo de parmetro" e "argumento de tipo" como sinnimos, mas esses termos no so a mesma coisa. Quando a codificao, um fornece argumentos de tipo, a fim de criar um tipo parametrizado. Portanto, o T em Foo <T> um parmetro de tipo e a sequencia em Foo <String> f um argumento de tipo. Esta lio observa essa definio ao usar esses termos.
Como qualquer outra declarao de varivel, este cdigo no realmente criar um novo objeto de Caixa. Ele simplesmente declara que integerBox vai realizar uma referncia a uma "Caixa de Integer", que como Box <Integer> lido. Uma chamada de um tipo genrico geralmente conhecido como um tipo parametrizado. Para instanciar essa classe, use a palavra-chave new, como de costume, mas colocar <Integer> entre o nome da classe e o parntese: Box <Integer> integerBox = new Box <Integer> (); The Diamond Em Java SE 7 e, mais tarde, voc pode substituir os argumentos de tipo necessrios para invocar o construtor de uma classe genrica com um conjunto vazio de argumentos de tipo (<>), desde que o compilador pode determinar ou inferir, os argumentos de tipo de contexto . Este par de colchetes, <>,
informalmente chamado de diamant e, por exemplo, voc pode criar uma instncia de Box <Integer> com a seguinte declarao: Box <Integer> integerBox = new Box <> (); Para mais informaes sobre a notao de diamante e inferncia de tipos, consulte Inferncia de tipos . Mltipla tipo Parmetros Como mencionado anteriormente, uma classe genrica pode ter vrios parmetros de tipo. Por exemplo, a classe OrderedPair genrico, que implementa a interface de genrico Par: interface pblica Par <K, V> { pblico K getKey (); pblico V getValue (); }
public class OrderedPair <K, V> implementa Par <K, V> {
pblico K getKey () {return chave; } pblico V getValue () {valor de retorno; } } As declaraes a seguir cria duas instncias da classe OrderedPair: P1 Par <String, Integer> = new OrderedPair <String, Integer> ("Even", 8); P2 Par <String, String = new OrderedPair <String, String ("Ol", "mundo"); O cdigo, novo OrderedPair <String, Integer>, instancia K como uma String e V como um Integer. Portanto, os tipos de parmetro de construtor OrderedPair 's so String e Integer, respectivament e. Devido a autoboxing , vlido passar um String e um int para a classe. Como mencionado no The Diamond , porque um compilador Java possa inferir os tipos K e V da declarao OrderedPair <String, Integer>, estas declaraes podem ser encurtadas usando a notao de diamante: OrderedPair <String, Integer> p1 = new OrderedPair <> ("Even", 8); OrderedPair <String, String> p2 = new OrderedPair <> ("Ol", "mundo"); Para criar uma interface genrica, siga as mesmas convenes como para a criao de uma classe genrica. Tipos parametrizados Voc tambm pode substituir um parmetro de tipo (ou seja, V K ou) com um tipo parametrizado (ou seja, Lista <String>). Por exemplo, usando o exemplo OrderedPair <K, V>: OrderedPair <String, Box <Integer>> p = new OrderedPair <> ("primos", novo Box <Integer> (...));
Tipos crus Um tipo de matria o nome de uma classe genrica ou interface sem quaisquer argumentos de tipo. Por exemplo, dada a classe Caixa genrica: public class Box <T> { public void set (T t) {/ * ... * /} / / ... } Para criar um tipo parametrizado de Box <T>, voc fornece um argumento de tipo real para o tipo de parmetro formal T: Box <Integer> intBox = new Box <> (); Se o argumento tipo real for omitido, voc criar um tipo de matria de Box <T>: Box rawBox = new Box (); Portanto, Box o tipo cru do tipo genrico Box <T>. No entanto, uma classe ou tipo de interface no- genrico no um tipo cru. Tipos primas aparecem em cdigo legado porque muitas classes de API (como as classes Colees) no foram genricas antes JDK 5.0. Ao usar tipos crus, voc essencialmente obter o comportamento pr- genricos uma caixa d- lhe objetos s. Para compatibilidade com verses anteriores, a atribuio de um tipo parametrizado para seu tipo cru permitido: Box <String> stringBox = new Box <> (); Box rawBox = stringBox; / / OK Mas se voc atribuir um tipo de cru para um tipo parametrizado, voc recebe um aviso: Box rawBox = new Box (); / / RawBox um tipo de matria-Box <T> Box <Integer> intBox = rawBox; / / Aviso: converso desmarcada Voc tambm recebe um aviso, se voc usar um tipo de matria e invoca mtodos genricos definidos no tipo genrico correspondente: Box <String> stringBox = new Box <> (); Box rawBox = stringBox; rawBox.set (8); / / Aviso: invocao desmarcada para definir (T) O alerta mostra que tipos de matrias e ignora as verificaes de tipo genrico, adiando a captura de cdigo no seguro para a execuo. Portanto, voc deve evitar o uso de tipos de matrias. O Erasure Tipo seo tem mais informaes sobre como o compilador Java usa tipos de matrias. Mtodos genricos Mtodos genricos so mtodos que apresentam os seus prprios parmetros de tipo. Isto semelhante ao declarar um tipo genrico, mas o mbito do parmetro tipo limitada ao mtodo em que declarada.Mtodos genricos estticos e no-estticos so permitidos, bem como construtores de classe genricos. A sintaxe para um mtodo genrico inclui um parmetro de tipo, dentro de colchetes, e aparece antes do tipo de retorno do mtodo. Para mtodos genricos estticos, a seo de tipo de parmetro deve aparecer antes tipo de retorno do mtodo. A classe Util inclui um mtodo genrico, compare, que compara dois objetos par: public class Util { / / Mtodo esttico genrico estticos boolean <K, V> pblicas comparar (p1 Par <K, V>, Par <K, V> p2) { voltar p1.getKey (). equals (p2.getKey ()) && . p1.getValue () igual a (p2.getValue ()); } }
public class Par <K, V> {
chave K privado; valor V privado;
/ / Construtor genrico Par pblica (chave K, valor V) { this.key = chave; this.value = value; }
/ / mtodos genricos public void setKey (tecla K) {this.key = chave; } setValue public void (valor V) {this.value = value; } pblico K getKey () {return chave; } pblico V getValue () {valor de retorno; } } A sintaxe completa para invocar este mtodo seria: P1 Par <Integer, String = new Par <> (1, "ma"); P2 Par <Integer, String = new Par <> (2, "pera"); . boolean mesmo = Util <Integer, String comparar (p1, p2); O tipo foi expressamente previsto, como mostrado em negrito. Geralmente, isso pode ser deixado de fora e o compilador ir inferir o tipo que necessrio: P1 Par <Integer, String = new Par <> (1, "ma"); P2 Par <Integer, String = new Par <> (2, "pera"); booleano mesmo Util.compare = (p1, p2);
Concluso O presente estudo abordou um tema bastante presente na programao sobre o Generics em Java, que veio com a inteno de ajudar o programador a evitar o desperdcio de tempo verificaes mais rpidas aumentando assim sua produtividade ao utiliza-lo.
Referencias Bibliogrficas Lanhellas, Ronaldo. Usando Generics em java. Disponvel em <http://www.devmedia.com.br/usando-generics-em-java/28981> Acessado em: 31 mai. 2014 The Java Tutorials. Disponvel em <http://docs.oracle.com/javase/tutorial/java/generics/types.html> Acessando em: 31 mai. 2014