Visualizzazione dei risultati da 1 a 7 su 7

Visualizzazione discussione

  1. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da filograndipad2 Visualizza il messaggio
    c'è qualche anima pia capace di fare un paio di esempi e farmi capire il meccanismo che è alla base degli eventi in Java puro (senza interfacce grafiche ecc.)?
    Da quello che ho capito al momento, in Java la questione degli eventi sfrutta un pattern chiamato Observer ed è richiesto l'uso di interfacce che prendono il nome di Listener.
    Se io volessi creare una classe Cane in grado di sollevare un evento quando l'animale ha fame e, in questo caso, richiedere l'intervento di un oggetto di tipo Padrone che riempie la sua ciotola come dovrei fare?
    Allora, vediamo innanzitutto la cosa a livello concettuale (poi se vuoi del codice di esempio, si può fare).

    Ti è chiaro innanzitutto come si può realizzare il meccanismo di "callback" (richiamata, volendolo tradurre in italiano) tramite una interfaccia Java? C'è una interfaccia X che dichiara un metodo astratto (o più di uno). Una classe C riceve 1 oggetto che implementa X, lo può ricevere tramite costruttore o con un metodo apposito, non ha molta importanza ora. Notare che alla classe C non interessa di che classe è quell'oggetto ricevuto, a C basta "vederlo" di tipo X, la interfaccia. Quando un oggetto di classe C vuole "notificare" qualcosa, invoca quel metodo di X sull'oggetto che si è tenuto da qualche parte come variabile di istanza.

    Attenzione che questo NON è un Observer, né un listener (listener intendendo anche proprio quelli specifici di AWT/Swing). È semplicemente l'uso basilare, minimale della programmazione ad oggetti per realizzare un meccanismo di "callback". Le interfacce si usano solitamente proprio per rappresentare un "contratto" tra due parti.

    Il Observer è un design pattern specifico, che può fare certamente uso delle interfacce. Infatti l'entità "observer" (chi osserva e riceve le notifiche) è generalmente descritto a livello astratto da una interfaccia. Il "soggetto" (Subject o anche Observable) che è l'entità da cui si originano le notifiche tipicamente dovrebbe essere anch'esso descritto da una interfaccia, sebbene in casi specifici possa essere una classe concreta.

    Una implementazione del pattern Observer è già presente nel framework standard, dove java.util.Observer è una interfaccia mentre java.util.Observable è una classe concreta. Il fatto che sia una classe può ovviamente essere un limite a seconda di dove lo si vorrebbe usare.
    Questa nel framework comunque è solo una possibile implementazione, chiunque ne può realizzare un'altra più in linea con il design pattern Observer "teorico".

    Un Observer però è qualcosa di più del meccanismo di callback detto prima: innanzittutto la questione concettuale è che l'Observer si usa tipicamente quando si vuole notificare un cambiamento di stato di un oggetto (es. una proprietà dell'oggetto che cambia valore).
    Inoltre nel pattern Observer il soggetto tipicamente mantiene un elenco di N osservatori, quindi non solo uno. E tipicamente viene permessa l'aggiunta così come anche la rimozione di un osservatore.

    Quando si parla di listener bisogna precisare se si intende il termine in senso generale (un "ascoltatore", come potrebbe essere la callback detta all'inizio) oppure se si intende in modo specifico i listener come quelli delle interfacce grafiche AWT/Swing. I listener di AWT/Swing sono una "specializzazione" del pattern Observer e in AWT/Swing sono implementati usando una serie di linee guida e convenzioni ben precise.
    Tra l'altro i listener di AWT/Swing servono più in generale per notificare "eventi", quindi non necessariamente un cambio di stato di un oggetto.

    Fin qui è tutto chiaro?
    Ultima modifica di andbin; 23-06-2018 a 21:17
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

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.