Java Performace

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.

Obrigado pessoal, se puderem me ajudar, valeu!! :smiley:

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.

Outras dicas:

[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]

Outra forma seria usar o operador ternário:

public String verificacao(String s){ return "tipoA".equals(s) ? "aceito" : "negado"; }

Também é uma boa observar as convenções de código da sun.

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.

Não existe passagem por referência em Java.

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.

Eu sei, só reforcei o conceito pq isso é tema de muita confusão…

Com certeza… meu post anterior ficou meio confuso mesmo… :oops:

acho que vc poderia user um valor boleano no segundo método.