Translate

quarta-feira, 23 de abril de 2014

Wrapper e Primitivos, quando utilizar?

Os tipos de uma varável em JAVA (uma linguagem fortemente "tipada") são fundamentais no código e devem ser escolhidos com cautela, analisando sempre o que cada variável deve representar, seja para a lógica de negócio da aplicação, seja para variáveis de controle de fluxo do código. 

Os tipos primitivos, já são de conhecimento da maioria dos programadores e são exibidos na tabela abaixo: 



As classes Wrapper nada mais são (em linhas gerais) do que uma Classe, que "representa um primitivo", desta forma, uma variável de um tipo Wrapper pode ser null e pode ser instanciada (na memória) ou não (quando possui valor nulo). 

É fácil localizarmos as Classes Wrapper, que possuem os mesmos nomes dos tipos primitivos, somente com a primeira letra maiúscula. 

O Java nos oferece Classes Wrapper para todos os tipos primitivos. Assim sendo, todas linhas de código abaixo são válidas. 

        Byte b = null; 
        Short s = null; 
        Integer i = null; 
        Long l = null; 
        Float f = null; 
        Double d = null;
        Character c = null; 
        Boolean bol = null;


Além de possuir diversos métodos para trabalharmos com os primitivos que ela representa, ela nos oferece dois construtores, um recebendo como parametro um valor do tipo primitivo que ela representa 
Integer inteiro = new Integer(10); 
 
e outra recebendo uma String que é convertida para o valor primitivo que a classe Wrapper representa, 

Integer inteiroStr = new Integer("10"); 
 
Uma das necessidades de se utilizar um Wrapper, ao invés de um primitivo, é construtores de classes de algumas API (Collections por exemplo) não suportam tipos primitivos.  O código abaixo, por exemplo, não compila:


    List<int> lista = new ArrayList<int>();

O correto, seria utilizar Wrapper:


    List<Integer> lista = new ArrayList<Integer>();

Autoboxing

Um objeto Integer pode receber um primitivo diretamente, através do Autoboxing:

  Integer i = 15; 


Ou ainda:

    int inteiroPrimitivo = 15; 
        
    Integer k = inteiroPrimitivo; 
        

Ou ainda, nossa lista de Integer pode receber diretamente um valor primitivo, ou usando o construtor recebendo uma String como parâmetro:

    List<int> lista = new ArrayList<int>();

    lista.add(15);
    lista.add(new Integer("40"));


Unboxing

Abaixo, exemplos de Unboxing explícitos e implícitos (automáticos):

 

        int i = 10;

        Integer inteiroWrapper = new Integer(i);  // Boxing Explicito
        int k = inteiroWrapper.intValue();        // Unboxing Explicito

        inteiroWrapper = i; // Boxing Automatico
        k = inteiroWrapper; // Unboxig Automatico


Resumindo, o procedimento de Boxing converte um valor primitivo numa referência do seu correspondente Wrapper (Integer), já no procedimento de Unboxing, a referencia é transformada no tipo primitivo correspondente. 

Abaixo exemplos de outras conversões: 

 
        boolean boolValor = true;
        byte b = 2;
        short s = 2;
        char c = '2';
        int i = 2;

        // Boxing
        Boolean boolReferencia = boolValor;
        Byte bReferencia = 88;
        Short sReferencia = 2;
        Character cReferencia = '2';
        Integer iReferencia = 2;
       // Integer iRef1 = s; // ATENÇÂO!! tipos short não podem ser associados a Integer

        // Unboxing
        boolean boolVal1 = boolReferencia;
        byte b1 = bReferencia;
        short s1 = sReferencia;
        char c1 = cReferencia;
        int i1 = iReferencia;

Nenhum comentário:

Postar um comentário