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:
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.
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!