Você está na página 1de 7

Aprofundamento em Java

J Instruo for aprimorada O for aprimorado serve pra iterar sobre uma Collection sem ter que declarar a instruo for convencional. s fornecer o tipo de elemento que a Collection armazena e o nome da mesma. A desvantagem desse for aprimorado que o mesmo s til se voc no pretende alterar os elementos da Collection, nem depende do ndice deles. Lista de parmetros de mtodo com comprimento indefinido Quando no definindo o nmero de elementos do mesmo tipo que um mtodo pode receber, usamos reticncias entre o tipo do elemento e o nome que esse elemento vai receber (Ex.: double...numeros) na lista de parmetros desse mtodo. O mtodo ento inicializar um array desse tipo contendo os elementos passados pra ele. O programa ter de lidar com esse array ao invs dos elementos isolados. importante ressaltar que esse recurso s pode ser usado uma vez por lista e, se usado, dever ser informado somente no fim da mesma. Importao static A importao static usada quando no desejamos informar o nome completamente qualificado dos mtodos static de uma classe toda vez que os utilizamos (Como em Math. sqrt (double) ou em Arrays.copyOf(T[],int)). Usamos, ento, a importao static, a qual consiste em adicionar static depois de import na linha em que feita a importao e ento importar a classe normalmente. Depois de inserir o nome da classe informa-se o mtodo static que vai ser importado, ou digita-se * para importar todos os mtodos static dessa classe. Ao fim desse processo usaramos ento sqrt (double) e copyOf(T[],int). Exceptions encadeadas Dentro de um bloco catch, quando capturamos uma Exception qualquer, algumas vezes interessante lanar uma outra Exception diferente da capturada. O problema que, dessa maneira, perderamos essa primeira Exception e, com ela, a causa inicial do problema que enfrentamos. Para resolver esse impasse, Java oferece um construtor da classe Exception que recebe essa primeira Exception, o que garante que a nova Exception a ser lanada contm uma referncia inicial. Essa referncia faz com que, quando se imprime o caminho do problema, aparea a seguinte mensagem: Exception final caused by: ExceptionInicial . Diz-se que essas Exceptions esto encadeadas. Errors em Java Em Java, para notificar situaes atpicas que ocorrem durante a execuo de um programa, temos, alm das Exceptions ,os Errors. Os Errors so objetos (instncias de classes que estendem Error) lanados pela JVM quando uma situao realmente alarmante ocorre em tempo de execuo, tal como um

estouro de memria. Ao contrrio das Exceptions, que podem ser tratadas, os Errors geralmente sinalizam situaes adversas demais para um programa continuar sua execuo, logo, dificilmente so tratados. Operador de igualdade == entre objetos Quando o operador de igualdade == usado entre variveis que fazem referncia a objetos feita a comparao entre as referncias dessas variveis. Logo, a condio (objetoA == objetoB) s ser satisfeita se ambas as variveis objetoA e objetoB fizerem referncia ao mesmo objeto armazenado na memria, ou seja, mesma posio de memria. Classes aninhadas ou internas Java oferece o recurso de declarar classes dentro de outras classes, o que estabelece uma espcie de hierarquia alternativa entre elas, expressa por meio de nveis. A classe principal seria a classe de 1 nvel e a classe criada dentro de seu escopo seria a classe aninhada ou interna. A classe interna tem acesso a todos os recursos de sua classe de 1 nvel, tais como atributos e mtodos, por exemplo. A referncia entre elas feita da seguinte maneira: a classe interna se refere a si mesma como this e sua classe de 1 nvel como NomeDaClasse.this. Existe a opo de declarar a classe interna como static ou como no-static. Se a classe declarada como static, ento ela no depende de uma instncia da classe de 1 nvel para ela prpria ser instanciada. J se ela declarada nostatic, isso significa que ela s pode ser instanciada a partir de uma instncia pr-existente de sua classe de 1 nvel, visto que guardar uma referncia a esse objeto da classe de 1 nvel. Classe interna annima Uma classe interna pode nem mesmo receber um nome para ser utilizada pela sua classe de 1 nvel. Esse o caso das classes internas annimas, classes que geralmente so declaradas e instanciadas ao mesmo tempo dentro de um dos mtodos da classe principal. Essas classes usam uma superclasse no-annima para herdar comportamento e ento so utilizadas livremente pela sua classe principal. Mesmo herdando os privilgios de uma classe interna, as classes internas annimas tm certas restries quanto ao acesso a dados (como variveis) do mtodo em que foram criadas. Classes adaptadoras Comumente, quando implementamos uma interface, no pretendemos utilizar (muito menos implementar) todos os mtodos oferecidos pela mesma. Essa necessidade levou criao das classes adaptadoras, as quais consistem em classes que implementam determinada interface com todos os mtodos desta com escopo vazio (chamada implementao padro). A partir desse momento, uma nova classe criada que precise somente de alguns servios de uma interface pode estender a classe adaptadora que implementa tal interface e sobrescrever somente os mtodos que julgar necessrio.

Classes wrapped (encapsuladas) As classes wrapped so as classes criadas para que tipos primitivos possam ser tratados como Objetos. Ou seja, servem para encapsular um valor de certo tipo primitivo e fornecem mtodos para manipul-lo (na verdade, a maioria static) .Exemplos so Double, Integer e Character. Fluxo de pipe entre threads Pipe um canal de comunicao sincronizado que estabelecido entre duas threads (partes de um mesmo programa que esto sendo executadas paralelamente). A thread que envia dados o faz gravando-os em um PipedOutputStream e aquela que recebe esses dados o faz lendo-os de um PipedInputStream. Fluxo de filtro Um filtro fornece funcionalidades adicionais a um fluxo, como, por exemplo, o agregamento de bytes em tipos primitivos com sentido (char, int, etc.). Para isso, so usadas subclasses de FilterInputStream e de FilterOutputStream. Fluxo de dados Comumente, precisamos ler e gravar dados no como bytes, mas sim como valores de tipos primitivos como int, char, boolean e short, por exemplo. Um fluxo de dados exatamente isso: fluxo de valores de tipos primitivos. Em Java existem as Interfaces DataInput e DataOutput que tratam, respectivamente, da leitura e gravao dos valores mencionados. Fluxos armazenados em Buffer As operaes de E/S geralmente so muito lentas se comparadas com as operaes de transferncia de dados entre a memria principal e a CPU, por exemplo. Logo, deve ser evitado o uso constante dessas operaes, sob pena de diminuir drasticamente o desempenho de um programa. E exatamente para resolver esse problema de desempenho desse tipo de operao que usado o sistema de buffering. O sistema de buffering consiste em reservar uma regio da memria (o buffer) para armazenar os dados que seriam enviados ou requisitados isoladamente pelo programa com o intuito de fazer uma grande e nica operao de E/S quando o buffer se encontrar preenchido. No caso do buffer de entrada, este carrega as informaes que o programa requisita em um grande lote, e as fornece para o programa medida que este as requisita. J o buffer de sada recebe todos os dados que o programa gera isoladamente e os envia quando ele prprio (o buffer) se preenche. Os objetos que representam fluxos de sada baseados em buffering tm o mtodo flush , que fora a transferncia de dados do buffer. Diferena entre ArrayList e Vector ArrayList e Vector so classes de comportamento quase idntico,no entanto,existem certas diferenas entre elas: Vector mais antiga, e data de antes da criao de Collections; Vector traz suporte multithreading e ArrayList no; exatamente por esse motivo, para aplicaes que no utilizam

multithreading a melhor escolha ArrayList, devido sua performance superior. OBS.: Para inseres de colees ou mesmo de elementos no meio da lista, o mais recomendado usar LinkedList Stack uma pilha do tipo LIFO (Last In First Out). Inserem-se e removem-se elementos somente do topo da pilha (TOP). Mtodos:  PUSH: Insere um elemento no topo da pilha.  POP: Remove o elemento que est no topo da pilha.  PEEK: Retorna uma referncia para o elemento do topo da pilha sem remov-lo. Queue (No caso, PriorityQueue) Fila de espera (com tamanho determinado ou no), em que os elementos so ordenados de acordo com sua ordem natural- ou por meio de um Comparatore na qual os elementos so inseridos por um lado da fila e retirados do outro. Ao ser inserido (se a capacidade da fila ainda no tiver sido alcanada, caso contrrio o retorno do mtodo de insero FALSE), o elemento colocado numa posio de acordo com a ordem que est sendo utilizada, ou seja, o lugar na fila de um certo elemento dado de acordo com sua prioridade. Quando se vai retirar um elemento, retira-se aquele de maior prioridade. Mtodos:  OFFER: Insere um elemento na fila (se for possvel), na posio correspondente sua prioridade de sada.  POLL: Remove o elemento de maior prioridade, ou seja, o primeiro da fila.  PEEK: Retorna uma referncia para o elemento na primeira posio da fila sem remov-lo. Set (No caso, HashSet) Um Set um conjunto, e, por isso, no tem ordenao nem duplicatas. No prprio construtor de HashSet, por exemplo, as duplicatas so removidas da Colllection passada como parmetro. SortedSet (No caso, TreeSet) Um conjunto em que h uma ordenao, seja ela pela ordem natural dos elementos, seja por meio de um Comparator. Mtodos:  HEADSET (ELEMENTO): Retorna um subconjunto com todos os elementos do conjunto que so menores que o elemento fornecido como parmetro.  TAILSET (ELEMENTO): Retorna um subconjunto com todos os elementos que so maiores ou iguais que o elemento fornecido como parmetro.  FIRST, LAST: Retornam, respectivamente, o menor e o maior elemento do conjunto.

Maps Mapas so Collections que, basicamente, associam chaves (nicas) a valores (como, por exemplo, o nmero do CPF de um funcionrio e o objeto que representa o registro desse funcionrio). Esse tipo de Collection nasceu da necessidade de recuperao de informao de maneira rpida e eficiente, assim, se algum possui a chave associada a um certo valor, ela pode recuperar tal valor rapidamente. Se, num mapa, os valores se repetem, dizemos que o mapeamento utilizado o muitos para um , visto que mais de uma chave vai ser associada ao mesmo valor. No entanto, se, alm das chaves, os valores tambm forem nicos, ento o mapeamento utilizado o um para um , visto que haver uma bijeo entre chaves e valores (ser associada somente uma chave a determinado valor). O maior problema do mapeamento a chave a ser utilizada. Nem sempre ela pode ser usada diretamente como ndice do array em que sero armazenados os valores (a uma posio desse array damos o nome de clula ), como quando chave um nmero negativo, uma String, etc. E exatamente por esse motivo que algumas classes que implementam a interface Map utilizam uma tcnica chamada Hashing.  Hashing: O Hashing consiste num embaralhamento dos bits associados a um determinado objeto e tem como meta gerar um int. No caso de HashTable e HashMap (as classes referenciadas acima), esse int conseguido aps aplicar o hash na chave, e ento utilizado para determinar a clula em que ser armazenado o valor associado a essa chave.  Um problema relacionado utilizao de Hashing um glitch (falha de pequena gravidade) chamado coliso. Uma coliso ocorre quando mais de uma chave gera, por hashing, o mesmo valor para determinar a clula na qual seu valor vai ser armazenado, ou seja, quando mais de uma relao chave-valor acaba sendo associada mesma clula. A soluo mais utilizada para esse problema cada clula ser um bucket de hash , ou seja, uma lista vinculada com todos os valores que tem suas respectivas chaves associadas a essa clula.  Fator de carga: dado pela porcentagem de clulas ocupadas em relao ao nmero total de clulas. Quanto mais prximo de 1,0 o fator de carga de um Map, maior a chance de haver coliso. Mtodos (alguns):  PUT (chave, valor): Recebe uma chave e o valor associado a ela e insere essa nova relao no Map. Se essa chave j tiver sido inserida, o valor associado a ela ser atualizado para o valor passado como parmetro.  Get (chave): Retorna o valor associado chave passada como parmetro.  KEYSET: Retorna um Set com todas as chaves do mapa.  VALUES: Retorna uma Collection com todos os valores do mapa.

 CONTAINSKEY, CONTAINSVALUE: Verifica se a determinada chave ou valor, respectivamente, se encontra no Map. Properties, subclasse de HashTable A classe Properties estende HashTable, logo, tambm um Map. No entanto, Properties tem vrias caractersticas peculiares que merecem ser comentadas:  Geralmente, num objeto Properties, tanto as chaves quanto os valores so do tipo String.  Um objeto dessa classe persistente, ou seja, pode ser gravado num fluxo de sada (como um arquivo).  No se usa PUT e GET em Properties (herdados de Map), e sim Get e Set para modificar o Mapa.  Eram usados nas verses mais antigas de Java para guardar as preferncias de um usurio em reao a um aplicativo, hoje existe um pacote especfico (java.util.prefs) para esse servio. Mtodos  STORE (OUTPUTSTREAM, COMENTRIOS): Recebe um objeto de gravao empacotador e um comentrio. Grava o objeto Properties num fluxo de sada (com um arquivo).  LOAD (OBJECTINPUTSTREAM): Recebe um objeto de leitura empacotador e l o objeto Properties do fluxo de entrada. Enum Enum em Java pode ser entendido como um tipo que tem todas as caractersticas de uma classe, mas que tem um nmero limitado de objetos desse tipo. Como exemplos, temos os naipes de um baralho (no existem outros naipes alm de ouros, paus, espadas e copas), livros do primeiro perodo (no existem outros livros de 1 perodo alm dos de lgebra, discreta, clculo, IP, IC), os personagens de um livro, tamanhos de roupas (P, M, G, U), etc. Como existe um nmero limitado de objetos de cada tipo Enum, tais objetos so declarados como FIELDS (constantes de classe) do tipo Enum correspondente, e sero acessados estaticamente. Ex.: Naipe naipe = Naipe.COPAS. Cada tipo Enum implementa implicitamente o mtodo values() , que retorna um array de seu tipo com todas as constantes Enum (do seu tipo, claro) declaradas por esse ele. No caso dos naipes, por exemplo, seria retornado um array [Naipe] que conteria Naipe. COPAS, Naipe.PAUS, Naipe.OURO,e eNaipe.ESPADAS . Colees sincronizadas e empacotadores de sincronizao A maior parte das colees em Java no oferece suporte sincronizao e, consequentemente, ao multithreading. No entanto, possvel, a partir das classes empacotadoras de sincronizao tornar colees no-sincronizadas colees sincronizadas. Os mtodos static de Collections que fazem uso desses empacotadores comeam por synchronizedTipoDaColecao e retornam visualizaes sincronizadas da coleo em questo. Ex.: List<Object> list = Collections.synchronizedList(listaASerSincronizada).

Colees no-modificveis e empacotadores no-modificveis Podemos usar classes empacotadoras no-modificveis para retornar visualizaes no modificveis de colees. Novamente, temos mtodos static em Collections que fazem uso de tais empacotadores e que retornam as visualizaes mencionadas. Esses mtodos comeam por unmodifiableTipoDaColection. Ex.: Set<Object> set = Collections.unmodifiableSet(setCujaVisualizacaoNaoPoderaSerModificada). Uma das principais aplicaes das colees no modificveis a possibilidade de fornecer uma verso s de leitura de uma dada coleo para threads que no tem permisso para modific-la, enquanto que uma visualizao sincronizada da mesma coleo est sendo acessada pela thread que tem permisso de modificar essa coleo. Implementaes abstratas de Colees Muitas vezes, precisamos de uma implementao de alguma coleo, mas no queremos implementar uma coleo completa e complexa como ArrayList ou SortedMap. nesse momento que podemos estender as implementaes abstratas das colees, como AbstractList ou AbstractSet . Essas implementaes abstratas fornecem verses reduzidas das colees a que se referem, e cabe subclasse que estender essas verses implementar os mtodos que lhe forem necessrios.

Você também pode gostar