Como funciona un return
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.
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.
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
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
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.
para modificar un registro (aleatoriamnete) mira la clase RandomAccesFile del paquete java.io
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);
}
}
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);
}
}
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();
}
public void mater()
{
Material ma = new Material();
ma.leer(var1,var2,var3);
repaint();
}
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.
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.
