quarta-feira, 6 de junho de 2007

ER é Rox

Espressão regular é Rox, hoje, um coléga pediu ajuda pra escrever um ER que retirase todos os caracteres que não fossem letras, números, virgulas, pontos e espaços

Saiu essa espressão [^a-zA-Z0-9á-úÁ-ÚàÀ,\\. ]
depois saiu essa [^a-z0-9á-úà,\\. ]
e então esta [^\\wá-úà,\\. ]

Tá, funcionou, mas ficou a dúvida: Porquê o conjunto á-ú não contempla à (a craseado)? Alguém saberia me responder?

Código de exemplo:

Pattern p = Pattern.compile("[^a-zA-Z0-9á-úÁ-ÚàÀ,\\. ]");
p = Pattern.compile("[^a-z0-9á-úà,\\. ]", Pattern.CASE_INSENSITIVE);
p = Pattern.compile("[^\\wá-úà,\\. ]", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("E ele disse 2X: 'java', 'guj',? 'ninja', 'é você É locura ÀÌÒÃÙìòùáÁóÓúÚíÍöôàùáãÕ'!");
System.out.println(m.replaceAll(""));

terça-feira, 5 de junho de 2007

Será mesmo?

Quem disse que no Java, não temos que nos preocupar com ponteiros?
Utilizando Java como linguagem/plataforma de desenvolvimento é comum ouvir a seguinte afirmação: "Utilizando Java você não vai precisar se preocupar com ponteiros".

Será mesmo que não temos que nos preocupar com ponteiros em Java?
Esta seria uma verdade absoluta? Se sim, ótimo, mas se não até onde esta afirmação pode ser verdadeira?

Encurtando a história pra este post não ficar muito grande, analise e me diga qual a diferença entre o código #1 e o código #2 em termos de memória, se é que tem alguma diferença.


#1 – CÓDIGO
ControleMensagem cMsg = new ControleMensagem();

MensagemUsuario msgUser = new MensagemUsuario();
for (Parceiro parceiro : parceiros) {
msgUser.setControleMensagem(cMsg);
msgUser.setParceiro(parceiro);
cMsg.addMensagemUsuario(msgUser);
}


#2 – CÓDIGO
ControleMensagem cMsg = new ControleMensagem();

MensagemUsuario msgUser;
for (Parceiro parceiro : parceiros) {
msgUser = new MensagemUsuario();
msgUser.setControleMensagem(cMsg);
msgUser.setParceiro(parceiro);
cMsg.addMensagemUsuario(msgUser);
}

Bom, vamos encurtar a estória, porque estou sem tempo pra explicar todos os detalhes.
Há uma grande diferença nestes dois códigos.
No código #1 você esta adicionando sempre a mesma referencia a cMsg através da linha:
cMsg.addMensagemUsuario(msgUser);
Ou seja, cMsg é uma collection que possui em todas as possições ponteiros para o mesmo objeto, logo se fizermos uma iteração sobre ele vermos sempre exatamente o mesmo conteúdo em todos os elementos.

No código #2 a referencia cMsg possuí vários elementos armazenados, mas desta vez, ele possui elementos realmente diferentes. Isto acontece porque a cada iteração a referencia msgUser aponta pra um objeto diferente, enquanto no código #1 a referencia msgUser aponta sempre pro mesmo objeto.

Então, será mesmo que não tem que se preocupar com ponteiros?
Cuidado com a afirmação de que não temos de nos preocupar com ponteiros em Java, em alguns casos esta pode não ser uma verdade absoluta.