O Sérgio Taborda escreveu um excelente artigo sobre otimização preventiva de código. Concordo com ele em quase tudo, só não considero alguns casos como otimização que, a meu ver, são boas práticas!
Primeiramente, deve se entender o que é otimização. Conforme o dicionário Aurélio, otimização, vem de otimizar cuja a definição para a informática é:
Aperfeiçoar (um programa, rotina, etc) a fim de que ele realize sua função no menor tempo ou no menor número de passos possível.
Só que um problema deve utilizar somente o número de passos necessários a sua resolução e nada mais e isso não ocorre nos casos abaixo, similares a exemplos colocados pelo Sérgio:
void fazAlgo(boolean ok){
if(ok == true){
//faz alguma coisa
}
else {
//faz outra coisa
}
...
private Set<Cliente> clientes;
void buscaCliente(cpf CPF){
Cliente resposta;
for(Cliente cliente : clientes){
if (cliente.getCpf.equals(cpf))
resposta = cliente;
}
return resposta;
}
Na função fazAlgo (desconsiderando possáveis otimização do compilador) a verificação é desnecessária, pois são feitas duas operações ao invés de uma). Na função buscaCliente a iteração continua mesmo que tenha encontrado o cliente na primeira iteração! Em ambos os casos temos um problema de desempenho por más praticas de programação na minha opinião!
As soluções de ambas são simples, e explicadas pelo Sérgio (deixa de ser preguiço e vai ler o post dele dele), mas não acredito que sejam "otimizações". Uma otimização possível do exemplo acima, que também foi exemplificado por ele, seria substituir o Set por um Map assim na busca de clientes teríamos um ganho de desempenho pois teríamos apenas uma operação sendo feito ao invés de N conforme exemplo abaixo. Nesse caso, temos realmente uma otimização preventiva.
private Map<CPF, Cliente> clientes;
void buscaCliente(cpf CPF){
return clientes.get(cpf);
}
Para concluir, a minha intenção ao escrever este texto é ressaltar a importância da diferença entre otimização e a alteração de código para corrigir problemas oriundos de más práticas programação. Más praticas devem ser combatidas e otimização devem ser feitas com moderação pois podem introduzir erros ou tornar o código confuso e de difícil manutenção. Conforme o citação retirado do livro Java Efetivo, de Joshua Bloch (o qual recomendo a leitura veementemente)
Mais erros de computação são cometidos em nome da eficiência (sem necessariamente atingi-la) do que por qualquer outra razão - inclusive a simples ignorância!
Então evite as más práticas e otimize com moderação!