2011-03-23 29 views
8

Me he encontrado queriendo hacer ciertas cosas en mis programas solo si una variable ha cambiado. Hasta ahora he estado haciendo algo como esto:¿Cómo detectar si una variable ha cambiado?

int x = 1; 
int initialx = x; 

...//code that may or may not change the value of x 

if (x!=initialx){ 
    doOneTimeTaskIfVariableHasChanged(); 
    initialx = x; //reset initialx for future change tests 
} 

¿Hay una manera mejor/más simple de hacer esto?

+0

Como referencia, encontré esta pregunta relacionada (aunque mal hecha): http://stackoverflow.com/q/3051114/431327 – Amplify91

+1

No. Nada más simple. Es posible que desee envolver su código en un objeto donde x vive dentro del objeto y 'if (x! = Initialx) {...}' es un método de este objeto. Pero esto puede terminar pareciendo más complicado. –

+0

Pero eso determinará solo cuando se ejecuta el script, una variable puede cambiar el valor antes de que se ejecute este script. Además, javascript no admite multihilo, java es un caso diferente –

Respuesta

5

Puesto que usted quiere encontrar y realizar alguna acción sólo si el valor cambia, me gustaría ir con setXXX, por ejemplo:

public class X 
{ 
    private int x = 1; 

    //some other code here 

    public void setX(int proposedValueForX) 
    { 
     if(proposedValueForX != x) 
     { 
      doOneTimeTaskIfVariableHasChanged(); 
      x = proposedValueForX; 
     } 
    } 
} 
4

Puede usar getter/setter con un bit sucio asociado a cada campo. marcarlo sucio si el valor se cambia a través de setter y forzar al usuario a usar los setters

+0

¿Podría explicar un poco más? Esto suena interesante, pero soy nuevo en la programación y no he usado bits sucios antes. ¡Estoy seguro de que otros que se crucen con esta pregunta también lo apreciarán! – Amplify91

+0

Es un poco simple, que se configura con algunas modificaciones en las cosas que está viendo. –

0

también puede usar el concepto de indicador, como cuando se cambia el valor de x. asignar true para una variable booleana. Mantenga boolean con el valor predeterminado como falso. consultar por este camino.

De esta manera es mejor que tener getters y setters en base de rendimiento, no tener código de redundante de dos métodos getters y setters.

0

Asumiendo que tienen múltiples hilos puede crear un monitor objeto y esperar a que el objeto cambiado para activar todos los hilos bloqueados.

Algo como esto:

private MyObject myObject; 

... other thread ... 
while(true) { 
    myObject.wait() 
    logic you want to run when notified. 
} 
... other thread ... 

... later on ... 

myObject.change(); 
myObject.notifyAll(); 
2

:

crear una variable con el mismo nombre con un número.

int var1; 
int var2; 

if(var1 != var2) 
{ 
//do the code here 

var2 = var1; 
} 

Espero que esta ayuda.

Cuestiones relacionadas