Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465

    Stranezza con interfaccia Observer

    Perché questo:

    codice:
    /* An object may be observed by two or more
       observers.
    */
    
    import java.util.*;
    
    // This is the first observing class.
    class Watcher1 implements Observer {
      public void update(Observable k, Object arg) {
        System.out.println("update() called, count is " +
                           ((Integer)arg).intValue()+ " (1)");
      }
    }
    
    // This is the second observing class.
    class Watcher2 implements Observer {
      public void update(Observable k, Object arg) {
        // Ring bell when done
    	  System.out.println("update() called, count is " +
                  ((Integer)arg).intValue()+ " (2)");
      }
    }
    
    // This is the class being observed.
    class BeingWatched extends Observable {
      void counter(int period) {
        for( ; period >=0; period--) {
          setChanged();
          notifyObservers(new Integer(period));
          try {
            Thread.sleep(100);
          } catch(InterruptedException e) {
            System.out.println("Sleep interrupted");
          }
        }
      }
    }
    
    class Esempio {
      public static void main(String args[]) {
        BeingWatched observed = new BeingWatched();
        Watcher1 observing1 = new Watcher1();
        Watcher2 observing2 = new Watcher2();
    
        // add both observers
        observed.addObserver(observing1);
        observed.addObserver(observing2);
    
        observed.counter(10);
      }
    }
    da questo:

    codice:
    update() called, count is 10 (2)
    update() called, count is 10 (1)
    update() called, count is 9 (2)
    update() called, count is 9 (1)
    update() called, count is 8 (2)
    update() called, count is 8 (1)
    update() called, count is 7 (2)
    update() called, count is 7 (1)
    update() called, count is 6 (2)
    update() called, count is 6 (1)
    update() called, count is 5 (2)
    update() called, count is 5 (1)
    update() called, count is 4 (2)
    update() called, count is 4 (1)
    update() called, count is 3 (2)
    update() called, count is 3 (1)
    update() called, count is 2 (2)
    update() called, count is 2 (1)
    update() called, count is 1 (2)
    update() called, count is 1 (1)
    update() called, count is 0 (2)
    update() called, count is 0 (1)
    e non questo?

    codice:
    update() called, count is 10 (1)
    update() called, count is 10 (2)
    update() called, count is 9 (1)
    update() called, count is 9 (2)
    update() called, count is 8 (1)
    update() called, count is 8 (2)
    update() called, count is 7 (1)
    update() called, count is 7 (2)
    update() called, count is 6 (1)
    update() called, count is 6 (2)
    update() called, count is 5 (1)
    update() called, count is 5 (2)
    update() called, count is 4 (1)
    update() called, count is 4 (2)
    update() called, count is 3 (1)
    update() called, count is 3 (2)
    update() called, count is 2 (1)
    update() called, count is 2 (2)
    update() called, count is 1 (1)
    update() called, count is 1 (2)
    update() called, count is 0 (1)
    update() called, count is 0 (2)
    Nel codice originale c'era scritto:

    System.out.println("Done" + '\7');

    Ma che cavolo è questo '\7' !?!?! Perché Eclipse non me lo rappresenta?!?!

    Il mio Eclipse è impazzito!?!?!

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Stranezza con interfaccia Observer

    Originariamente inviato da peruzzo

    da questo:

    codice:
    ...
    e non questo?

    codice:
    ...
    Perché è stato deciso così

    Guardando il codice di Observable si capisce subito il perché:
    codice:
    	public void notifyObservers(Object arg) {
    		Object[] arrLocal;
    
    		synchronized (this) {
    			if (!changed)
    				return;
    			arrLocal = obs.toArray();
    			clearChanged();
    		}
    
    		for (int i = arrLocal.length - 1; i >= 0; i--)
    			((Observer) arrLocal[i]).update(this, arg);
    	}
    Noti niente di particolare?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    Si, il ciclo for "è rovesciato" quindi inizia dall'ultimo membro di codice invece che dal primo, è questo che vuoi dire?

    codice:
    i--
    se è così è davvero strano... che utilità può avere una cosa di questo genere...

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Non ha alcuna utilità particolare, e non ti deve importare. Come dice la documentazione di Observable, l'ordine con cui vengono effettuate le notifiche non è garantito e può cambiare tra diverse implementazioni (ordine di inserimento, ordine inverso, a priorità, multithreading ecc...)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    Ragazzi quando divento insopportabile dovete dirmelo: E' UN ASSIOMA! PUNTO E BASTA! sia chiaro però... è colpa di java diversamente sarei altrove...

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Re: Stranezza con interfaccia Observer

    Originariamente inviato da peruzzo
    System.out.println("Done" + '\7');

    Ma che cavolo è questo '\7' !?!?! Perché Eclipse non me lo rappresenta?!?!

    Il mio Eclipse è impazzito!?!?!
    Il carattere di backslash ( \ ) serve ad effettuare dei quoting di caratteri non altrimenti rappresentabili (ad esempio, come fai a rappresentare il carattere di INVIO (nuova riga)? Si usa \n). In termine tecnico, queste si chiamano "sequenze di escape".

    Ovviamente ci sono tantissimi caratteri che non si possono facilmente rappresentare all'interno di un sorgente... Per ciascuno c'è un quoting (una brevissima lista):

    Le virgolette doppie ( " ): \"
    L'invio (Newline, nuova riga): \n
    Ritorno carrello: \r
    Tabulazione: \t
    Il backslash: \\
    ...

    Una forma particolare di quoting consiste nell'inserire, dopo il carattere di backslash, il valore del codice ASCII del carattere da stampare... in questo modo si possono scrivere tutti i caratteri come sequenza di escape (quoting):

    \65 --> A
    \32 --> (spazio)
    \7 --> (è un carattere particolare che serve ad emettere un BEEP con la scheda audio del PC)

    Una completa tabella dei codici ASCII la puoi trovare qui: http://www.asciitable.com/

    Esiste un altro modo per effettuare il quoting dei caratteri e consiste nell'usare la notazione UNICODE: \uXXXX (dove ciascuna X è una cifra esadecimale che compone il codice UNICODE del carattere). Esempio: \u00F6 corrisponde al carattere UNICODE ö.

    Altre delucidazioni in merito le trovi anche nel Tutorial Java sui caratteri: http://docs.oracle.com/javase/tutori...haracters.html


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    Si infatti c'è scritto anche sul libro che \7 avrebbe dovuto emettere un suono ma ho pensato che fosse un errore di traduzione... Io comunque con le casse ad alto volume non sento nessun beep!


  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da peruzzo
    Si infatti c'è scritto anche sul libro che \7 avrebbe dovuto emettere un suono ma ho pensato che fosse un errore di traduzione... Io comunque con le casse ad alto volume non sento nessun beep!

    Il Beep non proviene dalla scheda audio del PC, ma dalla speaker (se presente). Errore mio che ho scritto "Scheda Audio", intendendo Speaker.

    Non in tutti i PC è presente la speaker (ultimamente non mi pare ne vengano prodotti ancora... i moderni PC sono tutti dotati di scheda audio)... sul mio, ad esempio, non c'è e quel codice non produce alcun suono.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente bannato
    Registrato dal
    Sep 2012
    Messaggi
    465
    capisco... problema risolto...

    sempre grazie, sei una fonte di conoscenza senza limite!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.