Concetto: JavaBean
Questa linea guida fornisce una panoramica di JavaBean, un modello componente per Java semplice ed efficace.
Relazioni
Elementi correlati
Descrizione principale

Introduzione

JavaBean definisce un modello componente per Java semplice ed efficace. L'obiettivo dei JavaBean è di provvedere alle unità contenute autonomamente e riutilizzabili che possano essere manipolate praticamente dagli sviluppatori o in modo visivo nei tool di generazione.

I JavaBean possono essere rappresentati da controlli GUI o possono non avere alcuna rappresentazione visiva. Il linguaggio Java utilizza i JavaBean come controlli GUI per consentirne la gestione nei tool di generazione. In J2EE, semplici JavaBean vengono utilizzati comunemente dalle JSP, il cui compito consiste nella separazione di presentazioni in HTML e in codice Java, contenuto nei JavaBean.

Un JavaBean è una classe Java con tre funzioni distintive:

Proprietà di JavaBean

Alle proprietà di un JavaBean è possibile accedere attraverso altri componenti. In particolare, una proprietà è un valore privato cui si accede tramite metodi set e get, ma può anche essere un valore calcolato. Gli aggiornamenti delle proprietà possono comportare vari effetti collaterali.

Gli Accessor sono metodi che consentono di accedere alle proprietà. Tali metodi possono essere di tipo get o set e seguono convenzioni di denominazione:

void setPropertyName(PropertyType value); // setter
PropertyType getPropertyName() // getter

Per una proprietà boolean, un getter può essere:

boolean èPropertyName() // getter per una proprietà boolean

Esempio: Customer Bean

Di seguito viene riportato un esempio di un JavaBean elementare (Customer) con due semplici proprietà: nome ed e-mail. Notare come le proprietà siano definite mediante la coppia di metodi set/get.

Diagramma UML che mostra le proprietà del cliente.

public class Customer {
private String name;
private String email;

public String getName() {
return name;
}

public void setName(String aName) {
name = aName;
}

public String getEmail() {
return email;
}

public void setEmail(String aEmail) {
email = aEmail;
}

}

Questi JavaBean semplici sono spesso utilizzati nei JSP, dove consentono il trasporto di valori dalle forme nelle pagine Web.

Proprietà indicizzate

Oltre a proprietà semplici, che hanno un valore singolo, una proprietà può essere una serie di valori contenuti in una matrice.

Le proprietà indicizzate possono restituire un valore all'indice specificato, o l'intera matrice di valori.

Le proprietà indicizzate hanno le seguenti firme:

void setPropertyName(int index, PropertyType value); // indexed setter
PropertyType getter(int index); // indexed getter
void setPropertyName(PropertyType values[]); // array setter
PropertyType[]getPropertyName(); // array getter

Proprietà di associazione

Il meccanismo di proprietà di associazione provvede al servizio di notifica quando la proprietà cambia. Gli oggetti interessati che desiderano ricevere notifica della modifica si registrano in anticipo e quando avviene la modifica questi ricevono la notifica. In particolare, la notifica avviene mediante un evento generato dal componente con la proprietà di associazione dopo che la proprietà è stata definita.

Un JavaBean con una proprietà di associazione espone metodi per la registrazione e la cancellazione degli oggetti interessati, chiamati listener. Gli sviluppatori possono definire i propri meccanismi di notifica, ma le librerie Java forniscono varie classi di supporto di uso comune nel pacchetto java.beans.

Proprietà vincolate

Le proprietà vincolate sono simili a quelle associate, ma la notifica avviene prima che la proprietà venga definita. Ciò consente alle parti interessate di respingere le modifiche della proprietà lanciando PropertyVetoException.

Eventi e notifiche

Gli eventi sono funzioni dei JavaBean che consentono ai componenti sviluppati indipendentemente di comunicare con gli altri distribuendo informazioni circa la modifica di stato. In questo modello alcuni componenti generano eventi, che sono gestiti da altri componenti, nel ruolo di listener di eventi.

Per supportare questo modello di comunicazione, il modello di componente dei JavaBean fornisce:

  • proprietà che possono generare eventi (proprietà di associazione e vincolate)
  • metodi di registrazione, così che i listener possono registrarsi
  • eventi, che forniscono informazioni sulla modifica
  • listener, che possono reagire all'evento distribuito

I seguenti diagrammi di classe illustrano questi concetti relativi ad un JavaBean chiamato EventSource con una semplice proprietà int.

Diagramma descritto nel testo di accompagnamento.

Durante la configurazione, listener concreti si registrano con il JavaBean. In un punto successivo, altri oggetti richiamano il metodo setProperty, che avvierà il processo di notifica creando l'oggetto dell'evento. Il JavaBean EventSource invocherà il metodo propertyChange su tutti i listener registrati. I listener dell'evento riceveranno l'evento, ne leggeranno i valori e reagiranno all'evento.

Il seguente diagramma di sequenza illustra l'ordine delle invocazioni:

Diagramma descritto nel testo di accompagnamento.

La notifica dei listener è sincrona rispetto all'istanza di JavaBean, che è la fonte dell'evento, ma il listener dell'evento può attuare l'elaborazione degli eventi in un altro thread.

Introspezione

L'introspezione è un meccanismo runtime che consente la detenzione delle proprietà, degli eventi e dei metodi di un JavaBean. L'introspezione è utilizzata dai tool di sviluppo e da programmi che non utilizzano dipendenze molto codificate su altri componenti. L'introspezione viene raggiunta tramite riflessione e un insieme di convenzioni per la denominazione di metodi e interfacce. Ulteriori funzioni di introspezione sono supportate dalla classe BeanInfo. Le convenzioni per la denominazione dei JavaBean utilizzate per l'introspezione sono talvolta chiamate "pattern di progettazione", ma non devono essere confusi con la stessa nozione nella progettazione orientata all'oggetto.

Persistenza

Un JavaBean può essere persistente mediante un meccanismo di serializzazione. La serializzazione può essere automatica o personalizzata, a seconda se il JavaBean implementi interfacce serializzabili o esternabili. JDK 1.4 introduce classi XMLEncoder e XMLDecoder che provvedono alla memorizzazione delle istanze di JavaBean in formato XML.

Personalizzazione

L'apparenza e il comportamento di un JavaBean può essere personalizzato nel momento della progettazione. Ciò è particolarmente importante per i JavaBean visivi utilizzati in interfacce utente grafiche. La personalizzazione viene fatta tramite un editor di proprietà o utilizzando personalizzatori. I personalizzatori forniscono un'interfaccia utente personalizzata per la configurazione di un'istanza di JavaBean nel momento della progettazione.

BeanContext

BeanContext definisce una gerarchia di contenimento logica che consente ai JavaBean di verificare i servizi e le capacità dell'ambiente. I meccanismi BeanContext forniscono un supporto per una gerarchia logica di contenimento dei JavaBean e un controllo dei servizi offerti dai JavaBean nella gerarchia.

JavaBean™ Activation Framework

Il Java Activation Framework è un'estensione Java standard che consente di determinare dei tipi di una parte di dati, relativa incapsulazione, scoperta delle operazioni disponibili e istanziazione di un componente software che corrisponde all'operazione desiderata sulla parte di dati.

Ulteriori informazioni

Per ulteriori informazioni, vedere Specifiche API di JavaBean, Versione 1.01 nel sito http://java.sun.com/. Seguire i link a Docs & Training > Java 2 Platform, Standard Edition > Java 2 SDK, SE v1.3 documentation > JavaBeans > JavaBeans Specification.