Solução Passagem por Referencia

11 respostas
emanuell

Pessoal,

Estou com um problema. Tenho um metodo que recebe como parametro um String. Dentro deste mesmo metodo a String será alterada.
O problema é: Java não tem passagem de parametro por referencia.
A solução encontrada foi criar um array contendo o string e passar pro metodo.

Mas, surgiu uma duvida. Objetos passado nos metodos podem ser alterados (o caso do array), mas, o tipo String num é um objeto? Logicamente ele deveria ser alterado, nao seria?

Desde já agradeço.

[]'s

11 Respostas

furutani

emanuell:
Pessoal,

Estou com um problema. Tenho um metodo que recebe como parametro um String. Dentro deste mesmo metodo a String será alterada.
O problema é: Java não tem passagem de parametro por referencia.


Java sempre passa parametros por referencia.

É que String são objetos imutaveis. Dá um lida aqui

emanuell

furutani:
emanuell:
Pessoal,

Estou com um problema. Tenho um metodo que recebe como parametro um String. Dentro deste mesmo metodo a String será alterada.
O problema é: Java não tem passagem de parametro por referencia.


Java sempre passa parametros por referencia.

É que String são objetos imutaveis. Dá um lida aqui

Como assim? No java tipos primitivos não seria passagem por valor e objeto por referencia?

Outra coisa, teria outra solução além da passagem do array?

Mantu

Pessoal: Java faz passagem por valor, não por referência.
http://www.javaranch.com/campfire/StoryCups.jsp

furutani

Mantu:
Pessoal: Java faz passagem por valor, não por referência.
http://www.javaranch.com/campfire/StoryCups.jsp

É verdade Mantu. :oops:
Eu me confundi com isso aqui

Mantu

emanuell:
Como assim? No java tipos primitivos não seria passagem por valor e objeto por referencia?

Outra coisa, teria outra solução além da passagem do array?


Como disse antes, Jáva só faz passagem por valor, não importa se é um um tipo primitivo ou não. Depois de ler o maravilhoso tutorial que eu indiquei acima, isso vai ficar bem claro.
Uma alternativa ao uso de array, seria você criar uma classe que funcionasse como um wrapper de String. Como assim? Simples: Uma classe que tem um campo do tipo String e que proveja métodos que permitam alterar esse String. Um exemplo bem mínimo seria algo assim:

public class WString{
   private String string;

   public WString(String string){
      set(string);
   }

   public String get(){ return string; }

   public void set(String string){ this.string = string; }
}

Dessa forma, você pode desenhar seu método que deveria “alterar” o String passado por parâmetro de forma que receba não mais um String, e sim um WString.

public void alteraString(WString wstr){
   wstr.set("Já era o valor antigo desse String...");
}
emanuell

Mantu:
Pessoal: Java faz passagem por valor, não por referência.
http://www.javaranch.com/campfire/StoryCups.jsp

Um solução para este problema? Fiz passando um array com a String. Há outra?

emanuell

Obrigado pela ajuda!

[]'s

furutani

emanuell:
Como assim? No java tipos primitivos não seria passagem por valor e objeto por referencia?

Não é assim não. Dá uma lida aqui

emanuell:

Outra coisa, teria outra solução além da passagem do array?

Ao inves de string use StringBuffer.

furutani

ah lembrei se estiver usando java 5 use o StringBuilder

LPJava

emanuell:
Pessoal,

Estou com um problema. Tenho um metodo que recebe como parametro um String. Dentro deste mesmo metodo a String será alterada.
O problema é: Java não tem passagem de parametro por referencia.
A solução encontrada foi criar um array contendo o string e passar pro metodo.

Mas, surgiu uma duvida. Objetos passado nos metodos podem ser alterados (o caso do array), mas, o tipo String num é um objeto? Logicamente ele deveria ser alterado, nao seria?

Desde já agradeço.

[]'s

Não deveria nao. pq String é imutavel, um objeto String depois de criado ja era… vc nao pode mudar, mas pode referenciar a outro novo objeto… use a class StringBuilder, essas sao mutaveis… de uma olhada na api e vc vai ver…

class S{
String s = new String("camilo");
s="guj";
//parece que mudei minha String ne?
// mais nao mudei nao, objeto perdido ninguem ta referenciando.
//solução:
s+="guj";

parece que a String é mutavel mais nao é!!!

T

Se você descobriu que tem de alterar o valor de vários parâmetros, é melhor criar uma classe e passar um objeto dessa classe como parâmetro. A vantagem é que fica melhor documentado (odeio quando vou ler um programa com um método que tem 7 parâmetros e tenho de olhar a documentação para saber o que faz cada parâmetro; Objective-C e Smalltalk não têm esse problema porque os nomes dos parâmetros são passados na chamada do método.) Nem precisa usar setters & getters; pode usar atributos públicos mesmo, já que a classe é só para passagem de parâmetros.
(Outra vantagem que vi agora é que na verdade você cria MENOS objetos!)

Exemplo:

// Troque isto:
public void atualizaUsuario (String[] nome, String[] endereco, double[] saldo) {
    nome[0] = "Luís Inácio"; endereco[0] = "Rua dos Bobos, 0"; saldo[0] = 12.34;
}
...
String[] nome = new String[1]; nome[0] = "Fernando Henrique";
String[] endereco = new String[1]; endereco[0] = "R. Maranhão";
double[] saldo = new double[1]; saldo[0] = -34.56;
atualizaUsuario (nome, endereco, saldo);
// por:
classe Usuario {
    public String nome;
    public String endereco;
    public double saldo;
};
...
public void atualizaUsuario (Usuario u) {
    u.nome = "Luís Inácio"; u.endereco = "Rua dos Bobos, 0"; u.saldo = 12.34;
}
Usuario u = new Usuario();
u.nome = "Fernando Henrique"; u.endereco = "R. Maranhão"; u.saldo = -34.56;
atualizaUsuario (u);
Criado 11 de abril de 2007
Ultima resposta 11 de abr. de 2007
Respostas 11
Participantes 5