Galera tenho uma duvida que pode parecer um tanto quanto besta, mas vamos lá, supondo que existe o seguinte codigo:
//Funcao que retorna String
public String getSuposicao(){
return this.suposicao;
}
//Outra funcao que retorna String
public String verificacao(String s){
if(s.equals("tipoA"))return "aceito";
else return "negado";
}
-> Supondo o codigo acima qual maneira de programação é melhor? Segue abaixo as duas maneiras que pensei:
CODIGO 1
String s = getSuposicao();
String ss = verificacao(s);
System.out.println(ss);
CODIGO 2
System.out.println(verificacao(getSuposicao));
-> Pessoal qual metodo tem melhor performace? Qual melhor maneira de programação? Sendo que minha duvida é o seguinte, o “Codigo 1” é mais visivel mais facil de entender o “Codigo 2” é mais compacto, e nos deparamos diversas vezes com estes tipos de circunstancias onde precisamos chamar funcoes dentro de funcoes, entao gostaria de saber qual a melhor solucao nestes casos.
Acho que performance é a última preocupação nesse caso. Se houver alguma diferença, será insignificante.
Eu geralmente prefiro a forma mais compacta. Ela evita a criação de variáveis desnecessariamente. Geralmente, é uma boa política criar variáveis antes de onde elas serão usadas, no último momento possível, e com o menor escopo possível. O código compacto é o melhor exemplo dessa prática.
[code]//Outra funcao que retorna String
public String verificacao(String s){
//Compare a constante com a variável. É mais seguro do que fazer o
//contrário e também cobre o caso null
if(“tipoA”.equals(s)) return “aceito”;
//Se vocë deu “return” num if, pode dispensar o else.
return “negado”;
}
[/code]
Em outras linguagens isso pode fazer bastante diferença. Em C++ por exemplo quanto mais vc puder evitar a utilização do operador de cópia melhor ( ou seja, não passar parâmetros por valor mas por referência ). No caso do java, praticamente não há diferença, visto que tudo é reference, além do que o compilador e a vm otimizam o código pra executar mais rápido. Então como disse o ViniGodoy o mais importante é seguir as convenções de código pra ter um programa legível, que você possa dar manutenção depois.
Mas as variáveis de objetos são referências para os reais endereços do objeto na memória. Ao se passar uma variável dessas por parâmetro, faz-se uma cópia da referência.
Isso explica pq isso funciona:
public void zerar(Numero num) {
num.set(0);
}
E isso não:
public void zerar(Numero num) {
//Altera o num interno, mas o endereço da referência externa, de quem
//chamou zerar, permanece intacta.
num = new Numero(0);
}
No caso do C++, muito provavelmente os parâmetros vão estar declarados como const Classe& objeto, mas, realmente, é o programador que deve estar atento a esses detalhes… Variáveis temporárias podem mesmo gerar cópias imprevistas (e muitas vezes incorretas) e por isso, é bom desabilitar esses operadores, caso você não queira que isso aconteça (para isso, basta colocar a assinatura do operador = e do construtor de cópia na sessão private de sua classe no .h, ou estender boost::noncopyable).
foi isso que eu quis dizer… tudo é reference. Em C++ não é assim, você tem ponteiros, referências e objetos, e pode passar para os métodos ou retornar qualquer um dos três. Quando você passa um objeto por valor, ele copia o conteúdo daquele objeto e envia a ‘nova instância’ para o método. A diferença do java é que, fazendo um paralelo ao C++ é como se tudo fosse referência.