Classe sempre interessante do Commons-lang:
org.apache.commons.lang
public static
class ObjectUtils.Null
extends Object
implements Serializable
p>
Leituras
Classe sempre interessante do Commons-lang:
org.apache.commons.lang
public static
class ObjectUtils.Null
extends Object
implements Serializable
p>
Leituras
Mesmo programando há algum tempo em Java, há excepções que nos surpreendem e nos mostram que até somos capazes de não perceber nada disto.
Um colega obtinha, por vezes, uma excepção ConcurrentModificationException ao percorrer uma lista com um iterador. O código era uma versão mais complexa do seguinte excerto:
List lista = new ArrayList(); lista.add("obj1"); lista.add("obj2"); for(Iterator it=lista.iterator();it.hasNext();) { String elem = (String) it.next(); if("obj1".equals(elem)) { lista.add("elem3"); } }
O que acontecia era, se uma condição se verificasse, era removido um elemento da lista. Quando tal acontecia, a próxima vez que o método next() do iterador fosse executado, obtínhamos a excepção. Ao olhar para o nome da excepção
, a primeira ideia foi que, dado a lista não ser sincronizada, estavam threads concorrentes a aceder ao objecto. No entanto, a conclusão foi mais simples e lógica.
Quando se
altera a estrutura de uma lista – adicionando ou removendo elementos – à qual está ligado um iterador que estamos a percorrer, esse iterador fica inválido. Limita-se a verificar se fizemos operações que alterassem a lista, se sim, lança uma ConcurrentModificationException. Não que seja um nome de excepção adequado.
A este comportamento dá-se o nome de fail-fast, pois o iterador lança a excepção mal detecta que existiu uma alteração à lista e não fica à espera que ocorra um erro, não determinístico, mais tarde, ao percorrer o iterador.
De notar que o mesmo ocorre se usarmos o foreach do java 5 e removermos elementos.
Numa discussão com um amigo, surgiu o tema sobre como classificar uma annotation. Será um interface ou uma classe, visto que embora seja definido com @ interface, podemos atribuir e retirar valores da annotation, indiciando que existe uma implementação dos métodos.
Na realidade, uma annotation é um tipo de interface. Tal como todas as classes que criamos extendem implícitamente a classe Object, sempre que criamos uma annotation esta extende implícitamente o interface Annotation. O interface annotation tem a seguinte definição:
public interface Annotation { boolean equals(Object obj); int hashpre(); String toString(); Class extends Annotation> annotationType(); }
Se quisermos criar uma nova annotation, podemos declará-la da seguinte forma:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @ interface Teste{ String umMembro(); }
Definimos uma annotation de teste com um membro do tipo String. Definimos com a Retention que a annotation vai estar disponível em runtime, e definimos no target que esta annotation pode ser utilizada em métodos. Utilizaríamos a annotation, por exemplo, neste simples bloco de código:
public class AnnotationsTest { @Teste(umMembro="textoMembro") public void umMetodo() {} }
Estamos então a anotar o nosso método com a anotação que criámos anteriormente, e a definir uma propriedade exemplo. A primeira questão a reparar é que a annotation é um interface mas estamos a atribuir-lhe valores quando utilizamos a annotation, e podemos consultar as annotations definidas em run-time (porque colocámos retention = RUNTIME na definição da annotation). Podemos simplesmente, adicionar um método main a esta nossa classe AnnotationsTest para tentar perceber um pouco melhor o que acontece.
public static void main(String[] args) throws NoSuchMethodException {< AnnotationsTest at = new AnnotationsTest(); Annotation[] annots = at.getClass().getMethod("umMetodo").getAnnotations(); for(Annotation annot : annots) { System.out.println("Annotation? " + annot.annotationType().isAnnotation()); System.out.println("Interface? " + annot.annotationType().isInterface()); System.out.println("Nome da classe da annotation: " + annot.getClass()); System.out.println("Nome do tipo da annotation: " + annot.annotationType().toString()); Teste t = (Teste) annot; System.out.println("Valor do umMembro: " + t.umMembro()); } }
Na linha 3, vamos buscar todas as annotations do método umMetodo(). Isto é possível, porque com a introdução das annotations no Java 5, todos os elementos sobre os quais podemos aplicar anotações passaram a implementar o interface AnnotatedElement, que fornece um modo de se aceder às annotations numa classe, método, variável, parametro ou mesmo package. Depois percorremos a anotações e fazemos uns testes para ver o que
nos diz sobre o que é uma anotação. O output é o seguinte:
Annotation? true Interface? true Nome da classe da annotation: class $Proxy3 Nome do tipo da annotation: interface zonaj.testes.annotations.Teste Valor do umMembro: textoMembro
As primeiras duas linhas confirma-se o que já se sabia, a Annotation é um interface. Na terceira linha vem a explicação para as nossas dúvidas: a classe da anotação é um $Proxy3, nitidamente um proxy gerado pelo compilador em run-time. Este proxy é que implementa automáticamente os métodos para as propriedades definidadas na nossa anotação, bem como
os métodos do interface Annotation.
Nas duas outras linhas de output, vemos que o annotationType é o Teste que criámos e vemos como obter o valor indicado na anotação do método. Este método de geração de proxies não é muito explicado mas funciona aproximadamente como o Annotation Processing Tool (apt) que é uma aplicação que nos permite criar factories para gerar proxies e processar anotações.
De resto, uma anotação não é uma classe, é um interface. Só é criado um proxy automaticamente para poder ser utilizada.
Foi anunciado o Guice, a framework de dependency injection do Google. É baseada em Java 5
por isso tira partido do uso de generics e principalmente de anotations.
Esta framework promete ser mais leve, rápida e independente, fácil de integrar num projecto. É simples injectar código, sendo que podemos injectar contructores, atributos e quaiquer métodos que queiramos; integra com AOP Alliance para interceptar métodos e integra com strust e Spring.
Esta framework vem tocar directamente na área do Learn To Dj With Virtual Dj Home – Online Video Course
ef=”www.springframework.org”>Spring, mas ao que parece é possível integrar beans do Spring no Guice. Uma explicação de como se posiciona o Guice face ao Spring pode ser encontrada aqui.
É certamente uma hipótese a ter em conta dada a qualidade de outras frameworks do Google, como o GWT (Google Web Toolkit). Além disso é um resultado do que é utilizado em aplicações de larga escala do google, como seja o AdSense.
Já encontrei várias vezes esta situação: interfaces que definem explicitamente as suas propriedades e métodos como public.
Como explica [1] o conceito de interface implica que
All methods declared in an interface are implicitly public, so the public modifier can be omitted.
An interface can contain constant declarations in addition to method declarations. All constant values defined in an interface are implicitly public, static, and final. Once again, these modifiers can be omitted.
Assim, os seguintes interfaces são equivalentes
public interface Interface1 { public static final int someIntConstant = 2; public voidsomePublicMethod(int a); }
public interface Interface2 { int someIntConstant = 2; void somePublicMethod(int a); }
Actualização: a minha ConclusãoMesmerize Him: Best Epc / Conversion For Women
n>
Sou a favor do mínimo trabalho para obter o melhor código, logo farei por não utilizar os public, static ou final numa interface.
Será que o código fica mais legível com modifiers redundantes que estão a “encher”, ou com nenhuns modifiers?
Uma interface permite exactamente isso ao criador e ao leitor: não pensar em modifiers, apenas no resto. Logo penso que a legibilidade aumenta sem a utilização de modifiers redundantes.
E de notar que um (bom) IDE fará automaticamente os métodos public quando lhe dissermos que a classe implementa uma interface.
Leituras
Nos últimos tempos tenho visto muito código a utilizar final nas variáveis e parâmetros. Quando programo não tenho o habito de utilizar e julgo que isso é generalizado – dai que [1] faça a pergunta When was the last time you used final in your code?.
De [1]: can also be set only once, by the constructor of the class which defines it.
The final modifier can be applied to four Java constructs:
1. variables: a final variable can be set once and only once.
2. fields: a final field
3. methods: a final method cannot be overridden nor hidden.
4. classes: a final class cannot be extended.
Notice how using final is an entirely negative act. The final keyword works by subtracting, limiting default language mechanisms: the ability to override a method, to set a variable or a field. The motivations behind using final fall into three broad categories: correctness, robustness, and finally performance.
A principal razão que me leva a utilizar final em todos os parâmetros do método e na declaração de variaveis locais é que me traz muito mais garantia e segurança que estou a utilizar-los como desejo.Tal como [2] concluí:
Consistently using final with local variables (when appropriate) can be useful as well. It brings attention to the non-final local variables, which usually have more logic associated with them (for example, result variables, accumulators, loop variables).
Tudo muito interessante mas reparem na diferença:
O seguinte código é errado:
public void someMethod( final int a ) { a = 2; }
Tal como este:
public void someMethod( final Bean1 a ) { a = new Bean1(); }
Mas este já não
public void someMethod( final Bean a ) { a.setSomeInt(2); }
De [1]:
Note that final parameters are not considered part of the method signature, and are ignored by the compiler when resolving method calls. Parameters can be declared final (or not) with no influence on how the method is overriden.
Portanto podemos ter
public interface Interface1 { void someMethod(int a); void someMethod(Bean a); } public class Class1 implements Interface1 { public void someMethod( final int a ) { } public void someMethod( final Bean a ) { } }
Leituras:
Quem desenvolve aplicações web em Java e pretende usar Ajax, tem a vida facilitada com a utilização do DWR (Direct Web Remoting).
Resumidamente, o DWR permite, de uma maneira muito simples, usar Javascript no cliente para interagir directamente com os objectos
Java no servidor e tem vindo a tornar-se um standard neste tipo de tecnologia.
Para aqueles que usam o Netbeans como IDE, a vida fica agora (ainda) mais facilitada com o lançamento (não oficial) da primeira release de um plugin para DWR, disponível aqui.
Esta primeira release permite já editar visualmente o ficheiro de configuração do DWR (embora só para operações de create e new) e o drag & drop dos objectos exportados directamente para as JSPs!
Estão previstas para as próximas releases funcionalidades como a exposição de form beans de Struts e managed beans de JSF e de um editor para Signatures.
promete!
Acabado de chegar ao trabalho, fui dar a visita diária pelas minhas feeds
no google reader, e encontrei este interessante post com a notícia acabada de sair do forno: a Exadel, conhecida pelos produtos Ajax4jsf, Richfaces e pelo Exadel Studio, decidiu disponibilizar o Richfaces e o Exadel Studio Pro para desenvolvimento da comunidade open-source, colocando-os sobre a égide do JBoss.org.
O Ajax4jsf já tinha sido integrado no java.net e passa agora para o JBoss.org. Tanto o Ajax4jsf como o Richfaces estão já disponíveis como projectos JBoss, como JBoss Ajax4jsf e JBoss RichFaces, respectivamente, enquanto que o Red Hat Developer Studio – que substituirá o Exadel Studio – estará disponível lá para o verão e virá tomar o espaço ocupado pelo JBoss IDE, também ele já baseado no Eclipse IDE. Enquanto não sai o Developer Studio, a Exadel colocou a vers
ão Pro do Studio em trial, até ser lançado o RHDS que pode ser sacado aqui.
Teremos, assim, um ambiente de desenvolvimento open-source, uma ferramenta de alta qualidade especializada para trabalhar com JSF, ADF, Seam e outros, e com especial cuidado à integração de componentes da família jboss. Destaca-se, especialmente, a atenção que será dada ao JBoss Seam, tecnologia que falarei num próximo post.
A Exadel, passa para um modelo de serviço e não de produtização, sendo que teremos a hipótese de contratar suporte. Os detalhes de como funcionará a parceria Red Hat / Exadel encontram-se neste post do Sacha Labourey, general manager da JBoss.
Isto são mesmo excelentes notícias. O Ajax4jsf é, pelo que ouvi falar, um bom produto para desenvolver ajax e Development Studio pode aumentar muito a produtividade, porque vai ter estas ferramentas todas integradas com wizards e coisas do género.
As certificações actualmente disponibilizadas pela Sun não são, tal como a grande maioria das certificações, uma garantia completa da qualidade e capacidade de quem as tem. Já conheci diversas pessoas com mais certificações do que eu podia enumerar e que sabem tanto daquilo como muito programador júnior acabado de sair da faculdade. O problema destas certificações é que as pessoas as encaram como algo para o curriculum, sendo que normalmente quem tira certificações é porque precisa de provar competências que poderá ainda não ter adquirido. Há programadores com meses de experiência que são Java architects, embora a experiência de arquitectura que tenham não possa ser muito superior a nula. A realidade é que se marra para as certificações e depois esquece-se de tudo o que se leu, enquanto a certificação deve servir para provar que aquela pessoa desempenha aquele papel e já conhece as diversas áreas a serem certificadas.
Além disso, nem sempre as certificações são adequadas ao dia-a-dia de trabalho. Um programador com alguns anos de experiência, terá de dar uma olhadela em alguns livros antes de ir fazer um exame para java certified programmer, por muitas perguntas são problemas com os quais nunca se deparou na sua vida profissional. São estruturas de certificação rígidas. Embora eu próprio tenha como objectivo a curto prazo ser um Certified Java Architect, para poder por no cartão de visita e fazer inveja aos amigos – ok, não vão ter assim tanta inveja, mas sabem que se tiver a certificação lhes pago copos, por isso ficam sempre felizes – penso que começam a aparecer soluções mais interessantes de demonstrar skills de java.
Enter JavaBlackBelt
Em 2004 foi criado o JavaBlackBelt, tendo tido bastante sucesso nos tempos mais recentes. Con
siste num site que oferece certificação nas mais diversas áreas de java, de forma colaborativa. Temos exames desde Java básico até exames sobre Maven, Spring ou Hibernate, com diversos níveis ou com áreas específicas dentro de uma plataforma. Conforme se vão completando exames vão-se obtendo graduações – cintos – mais elevadas.
Os próprios exames e as suas perguntas, são contribuidas, votadas e moderadas pelos utilizadores do site. Para conseguir isto, os criadores do JavaBlackBelt criaram um esquema em que, para fazer mais exames, um utilizador tem de juntar o que eles chamam de “contribution points”. Podem obtê-los criando novas perguntas, novos exames, comentado perguntas existentes, editando objectivos de exames, etc. Mesmo enquanto estamos a fazer um exame, podemos dizer se gostamos da pergunta que estamos a responder ou se a achamos desajustada para aquele exame. Deste modo, é garantido que os utilizadores têm de dar algo à comunidade para se conseguirem certificar. Em contrapartida têm exames que foram criados e moderados por milhares de programadores e que são muito mais adaptados à realidade de um profissional.
Visto serem certificações online, o programador é encorajado a utilizar todos os meios que tem ao seu dispor para responder aos exames. Tal como num projecto real, pode utilizar o seu IDE, o seu browser para perquisar o que precisar. Se chumbar nalgum exame, pode voltar a repeti-lo, sendo que pode ter de esperar até 15 dias de intervalo para o fazer.
Do que tenho lido, algumas empresas nos Estados Unidos começam a ter atenção a este tipo de certificações. São normalmente tiradas por pessoas mais interessadas, são obrigadas a participar na comunidade e são orientadas não só à linguagem, mas também a outras frameworks e ferramentas. Era interessante que em Portugal se começasse a olhar também para isto. Fica
a chamada de atenção.
Sejam muito bem-vindos ao Zona J, um blog sobre java feito por portugueses, em português. Este é um projecto de conjunto, sendo que no início irá contar com a participação de 6 bloggers portugueses, todos eles profissionais com experiência de desenvolvimento em tecnologias relacionadas com java e que a seu tempo serão apresentados. Estará também disponível brevemente a página de sobre nós.
Porquê um blog de java em português?
Alguns de nós, em conversas de café falámos durante algum tempo sobre o adormecimento da comunidade java em Portugal. Blogs são quase inexistente, Java User Groups é apenas o Java.pt e este não só é pouco dinâmico, com está preso pelo patrocínio de empresas e, como tal, não poderá ser isento. Ao comparar-se a força de comunidades portuguesas de Microsoft .net vemos que a dinâmica é totalmente distinta, embora acreditemos que existe uma enorme quantidade de pessoas com experiência, capacidade e vontade de partilhar na área java.
Assim, juntámo-nos uns quantos de nós e decidimos partilhar o que sabemos, pensamos e experienciamos.
Qual é o objectivo do blog?
O objectivo é, antes de mais, partilhar o que nos passa na cabeça. Os problemas que enfrentamos no dia-a-dia, as novidades que lemos com os nossos fantásticos agregadores RSS, as ideias que achamos que vão mudar o mundo da computação, etc.
Este não é, no entanto, o nosso objectivo primordial. O objectivo do blog apenas será atingido se conseguir gerar atenção da comunidade java, discussão séria e que motive a que mais pessoas, a título individual ou em grupo, criem projectos deste género.
Uma comunidade forte aumenta os standards de qualidade da industria e, como tal, a qualidade do nosso trabalho.
Porquê Zona J?
O grande problema em criar um blog é escolher o nome. Aliás, foi o que nos fez demorar mais tempo a arrancar com o projecto.
Queríamos um nome original e como somos informáticos – logo pálidos e com óculos fundo de garrafa – tínhamos de ter assim um trocadilho daqueles que provassem a nossa inteligência. Como se pode ver, não conseguimos. O máximo que obtivémos foi uma referência bem catita a um conhecido filme da nossa praça, puxando pelo facto de tudo o que quer ser respeitado no mundo java, ter de ter a letra J em maíuscula nalgum sítio do nome.
Porquê …
Porque sim.
É tudo por enquanto. Ficamos à espera do feedback de quem nos ler nestes primeiros tempos.