Foros del Web » Programación para mayores de 30 ;) » Java »

por que a mi??

Estas en el tema de por que a mi?? en el foro de Java en Foros del Web. buenas chicos, llevo bastante tiempo con esto y no consigo ver el error. a ver si me podeis echar un cable: package muelles.escenario; public enum ...
  #1 (permalink)  
Antiguo 04/11/2009, 17:38
 
Fecha de Ingreso: noviembre-2008
Mensajes: 10
Antigüedad: 15 años, 5 meses
Puntos: 2
por que a mi??

buenas chicos, llevo bastante tiempo con esto y no consigo ver el error. a ver si me podeis echar un cable:

package muelles.escenario;

public enum Direccion {
ARRIBA, ABAJO, DERECHA, IZQUIERDA;


public void girarSentidoReloj (Direccion direccion) {
switch (direccion) {
case ARRIBA:
direccion=Direccion.DERECHA;
break;
case ABAJO:
direccion=Direccion.IZQUIERDA;
break;
case DERECHA:
direccion=Direccion.ABAJO;
break;
case IZQUIERDA:
direccion=Direccion.ARRIBA;
break;
}

}

package muelles.escenario;

public class prueba {

public static void main(String[] args) {

Direccion direccion=Direccion.ARRIBA;

System.out.println(direccion);
direccion.girarSentidoReloj(direccion);
System.out.println(direccion);
direccion.girarSentidoReloj(direccion);
System.out.println(direccion);

}

}

Como resultado me da arriba arriba y arriba, y me tendría que dar arriba, derecha y abajo. el objeto enumerado no cambia su valor y sigue siendo arriba y no se porque, a ver si alguien me puede echar un cable que estoy con esto un dia.
  #2 (permalink)  
Antiguo 04/11/2009, 22:25
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: por que a mi??

Hola,

En Java los parámetros de tipos de datos primitivos se pasan por valor. Por valor significa que el parámetro es una 'copia' de la variable y al cambiarle su valor se cambia la copia y no el original.

Los parámetros de objetos también se pasan por valor, pero en este caso el valor es un 'puntero' (1) que hace referencia al objeto original; si se cambia el puntero no afecta el original, pero si se cambian los valores a los cuales hace referencia, estos últimos si cambian.

Por ejemplo:

referencias.java
Código Java:
Ver original
  1. public class referencias {
  2.  
  3.     public void f(int a) {
  4.         a++;
  5.     }
  6.    
  7.     public void f(int[] a) {
  8.         a[0]++;
  9.     }
  10.    
  11.     public referencias() {
  12.         int a = 5;
  13.         System.out.println(a); // 5
  14.         f(a);
  15.         System.out.println(a); // 5
  16.        
  17.         int[] c = { 5 };
  18.         System.out.println(c[0]); // 5
  19.         f(c);
  20.         System.out.println(c[0]); // 6
  21.     }
  22.  
  23.     public static void main(String[] args) {
  24.         new referencias();
  25.     }
  26.  
  27. }

El valor de la variable no cambio en la primera llamada a f(), porque se paso por valor y se cambió la 'copia'. En la segunda llamada a f() se pasó una referencia a un objeto de tipo Array, y en este caso el primer valor del Array se cambió a donde apuntaba c[0].

Tendrías que cambiar el código para que regrese un valor del tipo enumerado,

Código Java:
Ver original
  1. public Direccion girarSentidoReloj (Direccion direccion) {
  2.   switch (direccion) {
  3.   case ARRIBA:
  4.     return Direccion.DERECHA;
  5.   ...
  6.   }
  7.   return null;
  8. }
Y recibir los valores en la misma variable,

Código Java:
Ver original
  1. Dirección d = Direccion.ARRIBA;
  2. d = d.girarSentidoReloj(d);
Saludos,

(1) En Java no existen los punteros, solamente referencias, pero es más fácil comprender que apuntan hacia algún dato o hacen referencia al mismo.
  #3 (permalink)  
Antiguo 05/11/2009, 09:27
 
Fecha de Ingreso: noviembre-2008
Mensajes: 10
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: por que a mi??

gracias, ya solucioné el problema esta mañan. en mi código estaba operando con la variable y no con el objeto que llamaba al método. he tenido que redefinir la función:

public Direccion girarSentidoReloj(){
switch(this)
case ARRIBA:return DERECHA...
.
.
.
}

direccion= direccion.girarSentidoReloj();

de todas formas muchas gracias por la explicación, me ha servido bastante para aclararme.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:20.