Como funciona un return

Nuri
30 de Septiembre del 2004
Hola,
Tengo una clase que llama a otra clase pasándole tres variables, en esta otra clase se hacen unas operaciones que modifican el contenido de las variables, y quiero que me devuelva el resultado a la primera clase. Como lo puedo hacer? si pongo:
return var1,var2,var3;
no me compila, sólo puede devolver una variable.

Gracias.

Rigel
30 de Septiembre del 2004
HOLA:

Bueno te recuerdo que un return es la finalización de un método que tiene un tipo de valor, es decir tiene que devolver un valor.

Sin embargo no se que tipo de operaciones esté realizando tu método, pero puedes asignar otra variable del mismo tipo en donde alojes tu valor final, otra forma sería que devuelvas el resultado de toda la operación.

Por ejemplo si se suman tus tres variables puedes hacer lo siguiente:

return var1+var2+var3;

realmente esto es lo que entiendo de tu problema, si entendí mal, me gustaría ver tu código para encontrar de forma más directa el error.

Suerte

Nuri
30 de Septiembre del 2004

Gracias por vuestra ayuda, creo que la mejor opción será poner las variables en un vector y devolver el vector, lo de meterlas en una clase y devolver la clase también está bien pero no sé como hacerlo.
De todas maneras, pongo el código y así sabreis mejor lo que necesito.

La clase MenuGas muestra una pantalla con tres campos: Código(var1), Descripción(var2) y Stock(var3).
Con el método mater(), le pasa las tres variables al método leer() de la clase Material, para que lea un fichero, grabe el contenido en cada variable y lo devuelva a la clase MenuGas para que lo muestre por pantalla.


El código es éste:

1ª clase:

public class MenuGas
{
private String var1="",var2="",var3="";

public void paint(Graphics g)
{
g.drawString("Codigo:",300,100);
g.drawString(var1,450,100);
g.drawString("Descripcion:",300,130);
g.drawString(var2,450,130);
g.drawString("Stock:",300,160);
g.drawString(var3,450,160);
}

public void mater()
{
Material ma = new Material();
ma.leer(ccod,cdes,csto);
repaint();
}

}


2ª clase:

public class Material
{
private String var1,var2,var3;

public String leer(String var1,String var2,String var3)
{
this.var1=var1;
this.var2=var2;
this.var3=var3;

try {
// Declarar fichero
File fmater = new File("Material.txt");
FileReader fr = new FileReader(fmater);
BufferedReader in = new BufferedReader(fr);
String reg;
StringBuffer buffer;
// Leer hasta fin de fichero
while ((reg = in.readLine()) != null)
{
int i=0;
buffer = new StringBuffer();
boolean surt=false;
// Grabar en un buffer el Código para Var1
while (!surt && i<reg.length() && i<=5)
{
if (reg.charAt(i) == ';')
surt=true;
else
buffer.append(reg.charAt(i));
i++;
}
this.var1 = new String(buffer);

surt=false;
buffer = new StringBuffer();
// Grabar en un buffer la Descripción para Var2
while (!surt && i<reg.length() && i<=25)
{
if (reg.charAt(i) == ';')
surt=true;
else
buffer.append(reg.charAt(i));
i++;
}
this.var2 = new String(buffer);

surt=false;
buffer = new StringBuffer();
// Grabar en un buffer el Stock para Var3
while (!surt && i<reg.length())
{
if (reg.charAt(i) == ';')
surt=true;
else
buffer.append(reg.charAt(i));
i++;
}
this.var3 = new String(buffer);
} // Fin de fichero
}
catch(IOException e) {}
return var1,var2,var3;
}
}

De esta forma sólo devolvería el último registro, pero con este return ni eso me hace.

De paso, sabeis como se hace para modificar un registro de un fichero? Y cómo acceder a un registro por clave?

Gracias por todo.

kiffa
30 de Septiembre del 2004
para modificar un registro (aleatoriamnete) mira la clase RandomAccesFile del paquete java.io

kiffa
30 de Septiembre del 2004
Solo tienes que hacerle unas pequeñas modificaciones al codigo para que te cambie los valores que estas buscando.

Para pasar el objeto y que se pueda modificar: ma.leer(this);
Para cambiar el valor de las variables (ya que las tienes privadas):
public void setVar1(String valor) {
this.val1 = valor;
}

public void setVar2(String valor) {
this.val2 = valor;
}
public void setVar3(String valor) {
this.val3 = valor;
}

Y finalmente hacer referencia desde la clase Material, y para que no cambies mucho la funcion leer lo siguiente:
public String leer(MenuGas menuGas) {
...
catch(IOException e) {}
menuGas.setVar1(var1);
menuGas.setVar2(var2);
menuGas.setVar3(var3);
}

Asi quedaria todo (no encontre la declaracion del metodo repaint, asi que lo comente):

import java.io.*;
import java.awt.*;

public class MenuGas
{
private String var1="",var2="",var3="";

public void paint(Graphics g)
{
g.drawString("Codigo:",300,100);
g.drawString(var1,450,100);
g.drawString("Descripcion:",300,130);
g.drawString(var2,450,130);
g.drawString("Stock:",300,160);
g.drawString(var3,450,160);
}

public void mater()
{
Material ma = new Material();
//ma.leer(ccod,cdes,csto);
ma.leer(this);
repaint();
}

public void setVar1(String valor) {
this.var1 = valor;
}

public void setVar2(String valor) {
this.var2 = valor;
}
public void setVar3(String valor) {
this.var3 = valor;
}

}


//2ª clase:

public class Material
{
private String var1,var2,var3;

public String leer(MenuGas menuGas)
{
//this.var1=var1;
//this.var2=var2;
//this.var3=var3;

try {
// Declarar fichero
File fmater = new File("Material.txt");
FileReader fr = new FileReader(fmater);
BufferedReader in = new BufferedReader(fr);
String reg;
StringBuffer buffer;
// Leer hasta fin de fichero
while ((reg = in.readLine()) != null)
{
int i=0;
buffer = new StringBuffer();
boolean surt=false;
// Grabar en un buffer el Código para Var1
while (!surt && i<reg.length() && i<=5)
{
if (reg.charAt(i) == ';')
surt=true;
else
buffer.append(reg.charAt(i));
i++;
}
this.var1 = new String(buffer);

surt=false;
buffer = new StringBuffer();
// Grabar en un buffer la Descripción para Var2
while (!surt && i<reg.length() && i<=25)
{
if (reg.charAt(i) == ';')
surt=true;
else
buffer.append(reg.charAt(i));
i++;
}
this.var2 = new String(buffer);

surt=false;
buffer = new StringBuffer();
// Grabar en un buffer el Stock para Var3
while (!surt && i<reg.length())
{
if (reg.charAt(i) == ';')
surt=true;
else
buffer.append(reg.charAt(i));
i++;
}
this.var3 = new String(buffer);
} // Fin de fichero
}
catch(IOException e) {}
//return var1,var2,var3;
menuGas.setVar1(var1);
menuGas.setVar2(var2);
menuGas.setVar3(var3);
}
}

Nuri
30 de Septiembre del 2004
Perdón, me he equivocado en el nombre de las variables de mater():

public void mater()
{
Material ma = new Material();
ma.leer(var1,var2,var3);
repaint();
}

eldrum
30 de Septiembre del 2004
Lo que tu buscas es modificar los parametros, lo cual requiere que los parametros sean pasados por referencia (un concepto que en java se ignora).

Depende de las operaciones que quieras hacer. Si lo que recives son tres objetos, y modificas los propios objetos mediante sus metodos, entonces no es necesario que lo devuelvas. por ejemplo si recives tres BufferString y usas el metodo append entonces no es necesario que devuelvas mediante return el valor, ya que el objeto es el mismo dentro y fuera del metodo.

Si lo que recives son tres primitivos (como el int o el float) u obtienes un nuevo objeto (por ejemplo ) var1 = param1.substring(), Entonces lo mejor es que devuelvas una estructura con los tres valores. Por ejemplo podrias crear una clase (podria ser hasta interna) con tres atributos publicos var1 var2 y var3, instanciarla, asignarle los tres valores y devolverla. Tambien puedes guardar los tres valores en un vector, pero si se trata de un metodo publico esto puede ser enrevesado, ya que depues realmente no sabes que es lo que te devuelve el metodo.

Espero que te sea de utilidad.