Enviar variável em um método

18 respostas
israelwm

Gostaria de usar uma variável num método, mais ou menos assim:

public static void testVar(int var) {
  var = 10;
}

ai quando chama o metodo;

int i = 0;
testVar(i);
System.out.println(i); //Imprime 10

pareçe babaca, mas é só um exemplo.

18 Respostas

Rafael_Nunes

coloca o retorno do método como um int, você está definindo como sem retorno(void):

public static int testVar(int var){

e dentro do método, retorna este int:

var = 10; return var;

israelwm

mas naum tem como fazer igual no pascal?

procedure testVar(var i : integer) begin i := 10; end;

pois eu preciso veerificar a variáveis e depois atribui-la.

jgbt
israelwm:
Gostaria de usar uma variável num método, mais ou menos assim:
public static void testVar(int var) {
  var = 10;
}

ai quando chama o metodo;

int i = 0;
testVar(i);
System.out.println(i); //Imprime 10

pareçe babaca, mas é só um exemplo.

java passa parametros por valor, não por referencia.
dentro do metodo vc ta modificando o valor do parametro do metodo, não da variavel externa.
acho que tem um tutorial aqui no guj falando sobre isso, da uma procurada.

[]'s

israelwm

bom, de qualquer forma orbigado, tive q procurar outra solução.

valeu a todos.

renatosilva

Usa Delphi mesmo deixa essa porcaria lixo merda de Java pra lá :twisted: :twisted: :twisted: :twisted:

jgbt, mas até objetos são por valor?

E se eu precisar retornar um int, um float, um PastaDeDente, um Toddynho, tudo de uma vez, como faço?

Não vale dizer “ah, você está com erro de modelagem”

Rafael_Nunes

Se você quiser fazer isso, aí basta retornar um DTOdoMetodoQueFazTudoNoMeuSistema

jgbt

sim, uma copia do valor.

[]'s

renatosilva

Po num zoa hehehehhe

jgbt

da uma olhada aqui p/ vc ver…

[]'s

T

Bom, nos meus tempos de Java 1.0, o pessoal ensinava a seguinte gambiarra:

static void soma (int[] x, int y) {
    x[0] = x[0] + y;
}
public static void main(String[] args) {
    int[] x = new int[1];
    x[0] = 10;
    soma (x, 20);
    System.out.println (x[0]); // imprime 30
}

Vê que dá um pouco de mão de obra para fazer algo parecido com um “parâmetro passado por referência…”
Mas dependendo do seu problema até funciona.
Obviamente recomendo os tais dos DTOs, que são uma maneira mais organizada de fazer tais coisas. (Um parâmetro ainda dá, dois já começa a complicar, 10 já é o caso de chamar a polícia).

renatosilva

Conclusão essa porcaria de Java num tem parâmetro por valor e como desculpa esfarrapada temos que usar gambiarras idiotas com nomes elegantes e nos achar super cool :twisted: :twisted: :twisted: :twisted:

PS: Não acho DTO um termo bem apropriado, mas dá pra aturar. Que tal PO (Package Objetc) heheheheh

renatosilva

jgbt, valeu pelo link, tô dando uma lida!!!

Rafael_Nunes

Essa é a questão, não é pra você usar caso for estupidamente necessário.
Se seu método precisa retornar coisas demais, talvez ele esteja fazendo coisas demais.
Ao invés de ter um método fazTudoNoMeuSistema(), você pode ter dezenas de outros cada um fazendo uma parte e retornando o que é necessário.

renatosilva

Mas Rafael, em vez de ficar fazendo gambiarra, a linguagem podia ter parâmetro por referência. Simples. Mas como não tem, a gente “não pode criticar”, portanto vamos dizer por aí que “variáveis de referência não são elegantes, são a pior coisa que inventaram etc etc etc”.

PS: alguém vai se ofender com isso :smiley:

renatosilva

thingol:
static void soma (int[] x, int y) { x[0] = x[0] + y; } public static void main(String[] args) { int[] x = new int[1]; x[0] = 10; soma (x, 20); System.out.println (x[0]); // imprime 30 }

Arrays não são passados por valor? Acho que uma solução mais ou menos seria usar os wrappers dos primitivos:

static void soma (Integer x, int y) ...
T

Não funciona porque não existe um método Integer.setInt.
Os wrappers são objetos “imutáveis”, ou seja, se um Integer foi criado com o valor 10, ele vai ficar assim até morrer.
Além disso a referência para o array é que é passada por valor; o array em si não é clonado ou copiado. É por isso que a tal gambiarra funciona.

renatosilva

Podes crer Thingol, esqueci desse detalhe. Bom então reformulando a solução mais ou menos, poderia-se criar wrappers mutáveis. E sobre os arrays, eu compreendi, eles são objetos (ou pelo menos têm o seu comportamento nesse caso).

T

Se não me engano existem uns “wrappers” mutáveis nalgum daqueles pacotes org.omg.corba.* que servem para poder interfacear programas Java com escritos em outras linguagens, que aceitam parâmetros passados por referência. Mas o uso é muito restrito, acho que só aparecem naqueles programas gerados automaticamente pelo idlj.

Criado 18 de maio de 2005
Ultima resposta 18 de mai. de 2005
Respostas 18
Participantes 5