Controlla se un campo è stato modificato in Java

0

Ho una classe di entità che l'utente costruirà l'oggetto usando i setter. Questo oggetto quando viene passato ad un altro livello, quel livello chiamerà il metodo constructChangeDataMap() per identificare le variabili che devono essere aggiornate in un altro framework.

Class Test {
   private int a;
   private int b;
   public int getA() {
      return a;
   }
   public void setA(int a) {
      this.a = a;
   }
   public int getB() {
      return b;
   }
   public void setB(int b) {
      this.b = b;
   }
   public Map<String, int> constructChangeDataMap() {
      // check what values has been modified and construct the map
   }
}

Che cosa sto facendo ora -

Per trovare le entità aggiornate dovrei avere una variabile booleana e quando viene chiamato il setter, questo booleano verrà aggiornato e quando verrà chiamato il metodo construtctMap, inserirò solo i valori aggiornati nella mappa. Tuttavia questo non sembra giusto. C'è qualche altro modello o modo per capire la variabile aggiornata.

    
posta Magesh Kumaar 27.07.2017 - 14:34
fonte

2 risposte

5

Ne esiste uno chiamato schema di osservazione . Quando qualcosa cambia il tuo stato chiamando i tuoi setter, passa attraverso tutti gli osservatori e fai sapere loro che sei cambiato. Puoi dire loro direttamente come sei cambiato o aspettare che ti richiamino e chiedi come sei cambiato.

Ci sono aromi che funzionano anche attraverso i thread.

La cosa davvero bella è che non devi sapere chi sono i tuoi osservatori. Lascia che ti dica chi sono. Mantieni una raccolta di elementi che ti consentiranno di chiamare la notifica su di essi. Lascia che si costruiscano quando si registrano come osservatori.

Potresti aver sentito di eventi o delegati. Quelle sono solo parole diverse per questa stessa cosa.

    
risposta data 27.07.2017 - 15:02
fonte
0

Ci sono due approcci di base a questo problema. Uno è quello di eseguire l'aggiornamento ogni volta che viene modificata una variabile. Questo è molto valido, ma comporta potenzialmente un sacco di aggiornamenti, che non suona come quello che vuoi. Non è adatto se il processo di aggiornamento è costoso o lento, o se eseguirlo più volte ha conseguenze negative. Se è quello che vuoi, il pattern Observer, come descritto da CandiedOrange, funzionerà bene.

Il modello alternativo è più adatto se il processo di aggiornamento è costoso o ha altre conseguenze negative da eseguire molto spesso e se è possibile prevedere quando è necessario eseguire gli aggiornamenti. Sembra la tua situazione.

In questo caso, tieni semplicemente traccia di quando ogni variabile viene aggiornata. Nel tuo esempio dovresti aggiungere due booleani privati 'updatedA' e 'updatedB'. Sono impostati quando modifichi rispettivamente A e B, facendolo nel setter per assicurarti che accada sempre. Quando si desidera aggiornare potenzialmente l'altro framework, si testano i booleani e si esegue l'aggiornamento pertinente se è impostato. Quindi cancelli i booleani.

Se il numero di variabili che si stanno aggiornando non è fisso, è necessario un qualche tipo di struttura dell'insieme per tenere traccia, aggiungendo una voce quando viene modificata una variabile e cancellando il set quando si verifica l'aggiornamento.

Questo approccio eseguirà solo un aggiornamento se la variabile è stata cambiata più volte, ma normalmente è ciò che desideri. Non funzionerà se la struttura remota tiene traccia delle modifiche. È inoltre necessario prestare attenzione in un ambiente con multithreading che le variabili non vengano modificate durante il processo di aggiornamento del framework.

    
risposta data 27.07.2017 - 15:56
fonte

Leggi altre domande sui tag