ReplaceAll() em Java 1.3

19/novembro/2010 - Geral

Olá

Para você, que como eu, está trabalhando com Java 1.3 e precisa do método replaceAll() da classe String ai vai ele. Coloque no seu famigerado singleton StringUtil.

public String replaceAll(String txt, String txtAtual, String txtNovo) {
         if (txt != null) {
            int idx = -1;
            while ((idx = txt.indexOf(txtAtual)) >= 0)
                    txt = txt.substring(0, idx) + txtNovo
                                    + txt.substring(idx + txtAtual.length());
           }
       return txt;
    }

Até mais,

Oracle e suas peripécias

22/outubro/2010 - Oracle

Olá

Hoje o Oracle me deu um baile, como faço todos os dias, estava eu tranquilo fazendo minha procedure PL/SQL quando de repente começo a obter esse erro:

LINE/COL ERROR
-------- ------------------------------------------
167/17   PL/SQL: ORA-00984: column not allowed here
160/7    PL/SQL: SQL Statement ignored

Olho aqui, olho lá, leio e releio as linha indicadas mas nada de ter uma luz para resolver esse problema. Resolvo criar o teste no PLSQL Developer (ver abaixo) com o trecho em torno da linha 167 mas o erro continua:

declare
  -- Local variables here
  i integer;
  --num_iden number;
  --num_cli number;
begin
  -- Test statements here
  insert into cad_endereco
    (num_cli_ende,
     cod_ende_ende,
     num_iden_ende,
     cod_ende_ende,
     cod_situ_ende,
     data_ende,
     usu_ende)
  values
    (num_cli,
     '0001',
     num_iden,
     '0001',
     'EN',
     '01',
     sysdate,
     user);
end;

Como o quantidade de código diminui e o scroolbar sumiu percebi que as variáveis num_cli e num_iden não estavam declaradas, lógico que não iria funcionar.
Visto isso, criei as benditas variáveis (no código acima estão comentadas). E não é que funcionou!!!

Poxa vida!! Não dava para me mostrar uma mensagem mais intuitiva do tipo a variável num_cli não está criada seu idiota??!! Mas com um column not allowed here é pra acabar com o meu dia. Já vi erro cuja mensagens não era assim uma beleza, mas essa ganhou disparado.

[desabafo mode="off"]

Até mais,
Roberto

Olá!

JM 84

 

A edição 84 da Java Magazine está mais especial pra mim, pois nesta edição está publicado o artigo Gerando relatórios com iReport escrito por mim.

Com ele espero ajudar de alguma forma os iniciantes nessa ferramenta, que como eu sofreram um pouco pra usar a duplinha dinâmica JasperReport/iReport.

 

 

Até mais,

Roberto

Boas Práticas – Dica nº 4

19/outubro/2010 - Geral

Olá

Nunca altere o estado dos objetos passados por parâmetro de um método, utilize uma variável temporária quando alterar o valor de algum atributo do objeto.

Essa prática é para evitar erros diante de uma confusão causada pelo tipo de passagem de valores que o Java adota. Java sempre faz a passagem por valor.

Abaixo um exemplo de erro que levamos a cometer quando alteremos o estado de um objeto.

Nós temos um objeto do tipo ItemPedido que possui os atributos quantidade e preço. Passamos esse objeto para o método totalizarPedido(), que para seu calculo interno subtrai um caso o parâmetro promoLeveUmGratis for true.

if(promoLeveUmGratis){

item.setQuantidade(item.getQuantidade().subtract(BigDecimal.ONE));

}

Observe que estamos atribuindo o resultado da subtração no mesmo objeto que recebemos por parâmetro para o cálculo na linha abaixo.

return item.getQuantidade().multiply(item.getPreco());

Em seguida os métodos calcularFrete() e darBaixaNoEstoque() são invocados.

ex.totalizarPedido(ip, true);
ex.calcularFrete(ip);
ex.darBaixaNoEstoque(ip);

Coloquei alguns sysout´s para ilustrar o problema.

Quantidade de itens no pedido:   10

Quantidade de itens no frete:    9

Quantidade de itens a dar baixa: 9

Note que para os dois métodos seguintes a quantidade que chegou foi alterada, não era essa a intenção. Isso traria sérios problemas para nós.

Downloads: Exemplo.java ItemPedido.java

Até mais,

Boas Práticas – Dica nº 3

19/outubro/2010 - Geral

Olá

Acrescentando e removendo parâmetros, todo desenvolvedor já precisou algum dia fazer essa alteração no código-fonte, esse é o tipo de refatoração mais comum na nossa vida.

Pode parecer simples quando o projeto é pequeno e pouco reaproveitado, mas precisamos ter muito cuidado ao fazer isso em grandes projetos cujo método é altamente reusado para não correr o risco de tomar um NoSuchMethodException em produção.

O procedimento é parecido para os dois tipos de refatoração.

1.       Crie um novo método com o novo parâmetro (ou sem o parâmetro se estiver removendo). Geralmente é um Ctrl+C e Ctrl+V do método existente apenas alterando a lista de parâmetros.

2.       Agora você deve copiar o corpo do método existente para o método novo.

3.       No método que já existia efetue a chamada do método novo. No caso de acréscimo de parâmetro você terá que passar um valor padrão para o parâmetro novo, eu geralmente uso null.

4.       Altere os demais códigos para que chame o método novo. Tente procurar pelo máximo de referencias.

5.       Execute o aplicativo e teste.

6.       Você pode apagar o método antigo, mas se isso não for possível por que o método faz parte de uma facade (interface) mantenha-o e coloque um @deprecated no javadoc dele.

Se precisar alterar o método com mais de um parâmetro, o ideal é fazer tudo de uma vez só para evitar retrabalho depois.

Muitos não têm o costume de retirar parâmetros, mesmo que não sejam mais usados. Eles mantêm o parâmetro boiando (inclusive eu :-D ) com a premissa de que não vai dar problema no comportamento do método, nisso temos razão, mas com certeza dará problema no seu entendimento ou no do pobre coitado alguns dias depois quando for dar manutenção.

Até mais,