2011-04-21 12 views
8

¿cómo puedo pasar un valor doble por referencia en java?java - pasando un valor doble por referencia

ejemplo:

Double a = 3.0; 
Double b = a; 
System.out.println("a: "+a+" b: "+b); 
a = 5.0; 
System.out.println("a: "+a+" b: "+b); 

este código se imprime:

a: 3 b: 3 
a: 5 b: 3 

y mi problema es conseguirlo para imprimir:

a: 3 b: 3 
a: 5 b: 5 

mi objetivo: estoy escribiendo una sistema experto en jess, en esa aplicación un segmento tendría un doble valor por su longitud, ahora que el doble v alue no está en un solo segmento; está en muchos otros segmentos, las clases de proporcionalidad, etc., todas las cuales se refieren a él, esperando que cambie para que puedan cumplir algunas reglas.

si no puedo cambiar ese doble, no puedo tener una determinada regla de fuego que contenga un objeto que haga referencia a ese doble valor.

+1

Nada en Java se pasa por referencia. Todo se pasa por valor. –

+0

@Chris o para ser más precisos http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing – Datoraki

Respuesta

1

@Título mismo: no se puede sin trucos "sucios". El método más fácil es pasar una matriz, o una clase que contiene el campo. Los cambios a esos se reflejarán muy bien.

Pero su problema es algo completamente diferente: los dobles son inmutables, por lo que cada cambio en él devolverá un nuevo valor. No hay nada que puedas hacer al respecto, aparte de implementar tu propia clase.

+0

ya se consideró aprobar las clases, pero me pareció feo hacer – Ouais

4

Los tipos de envoltura son inmutables en Java. Una vez que se crean, su valor no se puede cambiar (excepto a través de la magia de reflexión, por supuesto). ¿Por qué estás tratando de hacer lo que estás haciendo?

Editar: Sólo para elaborar, cuando establece:

a = 5.0; 

Lo que en realidad termina pasando es algo así como:

a = new Double(5.0); 

Si dobles eran mutables, que podría haber hecho algo así como

a.setValue(5.0);// this would have worked for mutable objects, but not in this case 

Por supuesto, puede escribir su propia clase, pero th Aquí hay muchos escollos, por lo que es mejor explicar que eres el objetivo

+0

Escribo un sistema experto para resolver problemas geométricos en jess, y un cierto valor doble, por ejemplo, la longitud de un segmento es una parte de muchas clases, ahora podría hacer clases para contener segmentos en lugar de valores dobles, pero eso causaría una explosión de clase mini – Ouais

+1

No, estás en lo cierto en las clases tienen "Segmentos" en lugar de Dobles. Esto hace que la intención sea clara, y en caso de que alguna vez modifiques el juego para usar algo que no sea el doble, hay un impacto menor. No te preocupes por demasiadas clases, en OOP, hay (casi) no hay demasiadas clases. –

+0

Supongo que es la forma más plausible de hacerlo, gracias. – Ouais

0

No puedes. En java no puede seleccionar el camino (por valor/por ref) por el cual los parámetros se pasarán a un método.

3

Puede intentar MutableDouble de commons-lang.

Pero no es que esto no tenga nada que ver con pasar por referencia: no está pasando nada.

+0

en realidad, el constructor de copia en doble pasa el objeto por valor, y quería que lo pasara por referencia, disculpas si la pregunta parecía oscura – Ouais

+0

@Ouais - en Java no puedes pasar la referencia en sí misma - pasas el valor de la referencia. Cuando haces 'a = 5.0', no es el mismo' a' que se establece en 5.0 - si eso fuera cierto, entonces 'b' también tendría 5. – CoolBeans

1

Doble es inmutable en Java. La asignación a = 5.0 no está cambiando el valor doble de a. En realidad, está creando un objeto doble completamente nuevo y cambiando el valor del puntero que a mantiene para apuntar a ese nuevo objeto. Si desea poder cambiar el valor sin cambiar la referencia, necesita hacer un doble mutable.

public class MutableDouble { 
    private Double value; 

    public Double getValue() { 
    return value; 
    } 

    public void setValue(Double value) { 
    this.value = value; 
    } 

    @Override 
    public String toString() { 
    return value != null ? value.toString() : "null"; 
    } 
} 

Luego llamaría a.setValue (5.0); y ambos cambiarían.

5

Java no admite punteros, por lo que no puede apuntar directamente a la memoria (como en C/C++).

Java no admite referencias, pero las referencias son solo referencias a Objetos. Los tipos nativos (incorporados) no se pueden referenciar. Entonces cuando ejecutaste (el autoboxing convirtió el código para ti a lo siguiente).

Doble a = nuevo Doble (3.0);

Eso significa que cuando se ejecuta

Double b = a; 

a obtener una referencia al objeto de una. Cuando se opta por cambiar un (autoboxing finalmente convertir el código anterior a esta)

a = new Double(5.0); 

cual no tendrá un impacto en la referencia de b para el new Double(3.0) creado previamente. En otras palabras, no se puede influir en la referencia de b manipulando directamente (o no hay "acción a distancia" en Java).

Dicho esto, hay otras soluciones

public class MutableDouble() { 

    private double value; 

    public MutableDouble(double value) { 
    this.value = value; 
    } 

    public double getValue() { 
    return this.value; 
    } 

    public void setValue(double value) { 
    this.value = value; 
    } 
} 

MutableDouble a = new MutableDouble(3.0); 
MutableDouble b = a; 

a.setValue(5.0); 
b.getValue(); // equals 5.0