Translate

quinta-feira, 8 de novembro de 2012

Java - Os rumos desta linguagem

Hoje vamos falar de algo mais descontraído, vamos refletir um pouco sobre os novos rumos da linguagem Java sem pretensão de ser dono da razão ou de ser imparcial, mas expor honestamente a percepção das ocorrências mais concretas definidoras dos rumos atuais desta linguagem "amada demais" e "cornetada" pelos efeitos colaterais de sua grandiosidade.

A finalidade é perceber o cenário atual, acertos, erros e colaborações necessárias para a continuidade desta história.

Vamos nessa.

Como a maioria dos programadores da linguagem Java já sabe, ela foi feita para atender a máxima "faça uma vez, execute em qualquer lugar".

Desde sua concepção, implantação, popularização e amadurecimento, o Java fez jus a sua máxima no que diz respeito a servidores, estações de trabalhos e computadores aplicados dotados de Linux. O Java se desenvolveu nos campos do JSE (Java Standard Edition) e JEE (Java Enterprise Edition).

Também deixou muito a desejar na sua proposta JME (Java Micro Edition) segregada conforme as limitações do hardware em CLDC e MIDP/CDC, o que exigia técnicas e precauções diferentes para complicar ainda mais o trabalho com JME até sua segunda versão. Hoje, o JME propõe maior integração e simplificação em sua terceira geração, mas convenhamos, o Android já chegou e será preciso um esforço extra para o JME 3.0 emplacar.

Prefiro focar no quadro geral e afirmar: apesar da Sun não ter tido sucesso em simplificar o JME e até mesmo não ter perfil para tê-lo difundido nos atuais smartphones, precisamos reconhecer o grande sucesso do Java nas plataformas empresariais o que não é pouco. Muitos criticam por achar que plataforma empresarial se limita a empresas, mas sem a "ortodoxia", plataforma empresarial é basicamente a ciência tecnológica a serviço das demandas de uma sociedade econômica de extrema exigência. Significa que o Java esteve até agora presente em muitos ciclos econômicos auxiliando uma Era da Informação por sua capacidade de integração transparente sobre modernos sistemas distribuídos.

O Java se consolidou e talvez parte de seus defensores e militantes estejam pensando no fim de um episódio de mais uma linguagem de programação. Todavia, o Java da Sun Microsystems não será mais o mesmo desde ter ficado órfão depois da saída de seu pai, James Gosling, da Sun. Isso está longe de ser uma intenção de provocar nostalgia nos defensores do Java, porque o Java se expandiu para uma JVM múlti linguagem em sua versão 7 e ainda expandiu para o Android quando a Google se inclinou a sua praticidade. Agora o Java não é mais encabrestado pela Sun e uma concorrência saudável já foi iniciada.

Esta alteração nas fronteiras Java não é obra do acaso, talvez seja obra de competição entre empresas, mas está marcada por um novo estágio da Era da Informação compreendido pelo domínio público do conhecimento promovido pelas redes sociais digitais e ainda pelo paradigma da Computação nas Nuvens. 

As empresas Google e Oracle deixam seus interesses e posições bastante claros neste novo cenário e vão produzir um Java cada vez melhor.

Fontes:
http://www.infoq.com/br/articles/invokedynamic
https://blogs.oracle.com/jrose/resource/pres/201107-JDK7.pdf
http://www.slideshare.net/amsterdatech/linguagens-dinamicas-na-jvm
http://www.amsterdaintelligence.blogspot.com.br/2010/03/mundo-das-linguagens-o-futuro-da.html
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

domingo, 4 de novembro de 2012

Java - Evitar NullPointerException

O NullPointerException é um erro comum num programa escrito em Java quando se opera uma variável do tipo objeto sem antes verificar se está nula.

Algumas estratégias sugerem usar um padrão de produção do objeto que ao invéz de retornar um valor nulo é retornado um objeto que simboliza não ter encontrado o objeto esperado. Exemplo: new ContatoNaoEncontrado("Not found").

Essa sugestão é ruim porque requer a criação de uma classe adicional para simbolizar o caso de não encontrado e ainda torna frustrante a codificação porque o fluxo esperado do programador pode ser enganado caso ele se descuide e deixe de verificar se o objeto retornado representa "not found" (não encontrado).

Acredito que não exista uma fórmula mágica para evitar todas as verificações de nulidade, mas nem por isso devemos deixar de acreditar numa solução que simplifica bastante esta tarefa em casos corriqueiros onde se trabalha com valores mais simples como é o caso das operações de números ou textos em termos de atributo ou variável simples para apoiar a execução de um método.

A função sugerida aqui é para simplificar operações de atributos e até mesmo realizar ETL de forma ágil e limpa, pois isso não é errado e reduz o volume de códigos na situação explicada. Aplicar um padrão de projeto nesses casos não convém e seria impraticável algum padrão de projeto.


Como a maior parte dos programas trata valores numericos e alfanuméricos em grande volume, elaborei esta técnica na tentativa de contribuir com a boa prática de programação. Ela consiste na criação de um método chamado ANPE (Avoid NullPoiterException ou Evitar NullPointerException) que recebe dois valores. Se o primeiro valor for nulo, então retorna o segundo valor.

Vamos à prática.

AvoidNullPointerException

A classe AvoidNullPointerException conterá o método ANPE do qual falei. Ele é estático e utiliza Java Generic para tornar a função flexível ao tratar todos os objetos. Coloque a classe dentro de uma package br.com.wt.util para facilitar o exercício.

package br.com.wt.util;
public class AvoidNullPointerException {
   
    public static <V> V ANPE(V object, V object2) {

        if (object == null) {
            return object2;
        }
       
        return object;

    }
       
}


Testando

O teste é simples, pois se value for nulo, então o tornaremos 0L (zero). A importação da função estática ANPE diminui o trabalho para invocá-la:

import static br.com.wt.util.AvoidNullPointerException.ANPE;

public class Test {
   
    public static void main(String[] args) {

        Long value = null;

        if (ANPE(value, 0L) == 1L) {
            value = 100L;
        }

    }
       
}


Este teste pode ser realizado com String, Integer, Short, Double, Float e outros tipos de objetos desde que se esteja testando um valor.

Mais um teste para fixar

Agora com uma String.

import static br.com.wt.util.AvoidNullPointerException.ANPE;

public class Test {
   
    public static void main(String[] args) {

        String country = null;

        if (ANPE(country, "").equals("Brazil")) {
            System.out.println("World Cup 2014");
        } else {
            System.out.println("But will 2016 Olympics in Brazil");
        }
       
    }
       
}


Boa programação.

quinta-feira, 1 de novembro de 2012

Java - Tutorial para manipulação binária

Em 2009, elaborei um tutorial para ajudar alguns colegas de trabalho a entederem sobre manipulação binária de uma maneira mais rápida a partir da liguagem Java, pois este assunto é muito complicado dominar sem ajuda. Como obtive ajuda de diversos colegas para entender este assunto ao longo dos anos, busquei compilar boa parte do assunto neste tutorial naquela ocasião.

Neste tutorial são abordados os assuntos como operações binárias, operadores AND (e), OR (ou), NAND (não é), NOR (não ou), XOR (disjunção de valores quando dois valores comparados são diferentes), operadores bit-a-bit (bitwise) e ordem binária (Big-Endian e Little-Endian).

Publiquei o tutorial para manipulação binária em Java em: http://goo.gl/X6hka

Qualquer dúvida adicional sobre este tutorial, envie um comentário.