professionale

Java: Arte e tecnica
Applicazioni e applet

Dario de Judicibus

 

Che cos’Φ un applet? E che differenza esiste fra un applet e una applicazione? Di seguito risponderemo a questa e ad altre domande, e costruiremo insieme una serie di modelli che ci serviranno come base per lo sviluppo di programmi in Java

 

Negli articoli precedenti abbiamo visto come Java sia un linguaggio di programmazione completo, in grado di soddisfare anche le esigenze di chi ha la necessitα di scrivere applicazioni molto complesse. In teoria, non esiste alcun motivo per cui non si possa utilizzare un’applicazione Java esattamente come si usa un eseguibile normale. Al momento, tuttavia, il fatto che Java non sia parte integrante dei sistemi operativi e la presenza di alcune limitazioni fanno s∞ che chi debba sviluppare applicazioni specifiche per una certa piattaforma preferisca linguaggi pi∙ classici, come, per esempio, il C++. Queste limitazioni nello sfruttare al massimo le peculiaritα delle singole piattaforme sono dovute al fatto che esso deve basarsi su un’architettura intrinsecamente portabile, e quindi generalizzata. In effetti, Java non si presenta come diretto concorrente di altri linguaggi largamente utilizzati nello sviluppo di applicativi. La scelta del linguaggio va sempre fatta sulla base di esigenze pratiche, non in base a princ∞pi pi∙ o meno discutibili o a preferenze personali. Se, per esempio, devo sviluppare un’applicazione che richiede elevate prestazioni e che deve sfruttare al massimo le funzioni specifiche della piattaforma UNIX o Linux, user≥ il C o il C++. Viceversa, se ho bisogno di sviluppare rapidamente un’interfaccia per la piattaforma Windows 95, sceglier≥ il Visual Basic. Il Rexx sarα una scelta ideale per sviluppare macro per le piattaforme Amiga e OS/2, ma in entrambi i casi sceglier≥ di nuovo il C o il C++ se devo sviluppare un eseguibile che sfrutti al massimo le librerie specifiche di questi ambienti operativi. In molti casi, poi, la scelta del linguaggio pu≥ dipendere dal tipo di applicazione che dovr≥ sviluppare: esistono infatti linguaggi pensati appositamente per gestire basi dati o sviluppare applicazioni multimediali. Dal Fortran al COBOL, da Delphi a Clipper, ogni linguaggio ha una sua ragione d’essere. Sono strumenti, e come tali vanno usati. Java Φ un linguaggio pensato per la Rete, e quindi deve garantire al massimo la portabilitα, l’interoperabilitα e la sicurezza. Questo ovviamente ha un prezzo. Dato tuttavia che l’essere in Rete Φ ormai una realtα consolidata anche per il computer di casa, chiunque sviluppi applicazioni dovrα sempre di pi∙ fare i conti con questo linguaggio.

Due tipi di programmi

D’altra parte, anche se pu≥ essere fastidioso dover scrivere java prima del nome di un programma per farlo eseguire, e anche se l’esecuzione stessa Φ pi∙ lenta di quella di un equivalente programma scritto in C, questo Φ solo un problema contingente. L’integrazione della macchina virtuale Java nei sistemi operativi, l’implementazione di interpreti sempre pi∙ veloci e compilatori just-in-time, faranno in breve dimenticare le attuali limitazioni. Nei prossimi articoli vedremo come giα da ora Java pu≥ essere utilizzato per scrivere programmini e utilitα di sistema, esattamente come un qualunque altro linguaggio. Ma andiamo per ordine.

Con Java possiamo scrivere due tipi di programmi, molto diversi fra loro per caratteristiche e funzioni. La prima categoria Φ formata dalle applicazioni. Un’applicazione non Φ altro che un programma classico, capace di interagire con il sistema operativo e con le sue risorse. Dato che in Java non esistono le funzioni, non Φ possibile definire una funzione main() come in C++ che rappresenti il punto d’ingresso della nostra applicazione. Quello che si fa Φ invece di definire una classe principale la quale conterrα al suo interno un metodo statico chiamato main(), che verrα eseguito quando la classe viene passata all’interprete. Lo scheletro di un’applicazione Φ quindi molto semplice, come si pu≥ vedere nel listato 1. Tuttavia, c’Φ un aspetto da non trascurare. Il metodo main Φ statico, e quindi Φ lo stesso per tutte le istanze della classe che lo contiene.

Essendo un metodo statico non si possono utilizzare al suo interno variabili che non siano a loro volta statiche oppure locali al metodo.

Se adottiamo la convenzione di utilizzare il prefisso cv per tutte le variabili di classe, iv per quelle dell’istanza e nessun prefisso per quelle locali, questo vuol dire che il metodo main non pu≥ far riferimento a variabili di tipo iv. Per superare il problema, si pu≥ ricorrere alla tecnica mostrata nel listato 2. Basta cioΦ creare all’interno del metodo main un’istanza della classe che contiene il metodo stesso, chiamandone il costruttore. Se poi ci si vuole assicurare che per ogni applicazione venga creata una e una sola istanza, si dovrα rendere il costruttore in questione privato, e chiamarlo solo se l’istanza in questione Φ nulla (listato 3). Questa tecnica, detta singleton, Φ molto utile quando si vogliono evitare istanze multiple di una stessa classe lα dove due istanze potrebbero entrare in contesa delle stesse risorse. Una tecnica simile pu≥ essere utilizzata per limitare comunque il numero d’istanze di una classe che possono essere utilizzate contemporaneamente. Tecniche di questo tipo sono molto utili nell’implementazione di servizi remoti a sistemi client.

Come generare un’applicazione

A partire da questi tre listati si possono sviluppare tutta una serie di applicazioni, come vedremo in alcuni dei prossimi articoli. Generare un’applicazione Java Φ semplice. Basta creare un file il cui nome Φ lo stesso della classe che contiene il metodo main e la cui estensione Φ java, per esempio ApplicationClass.java. DopodichΘ si esegue il comando

javac ApplicationClass.java

che genera il file ApplicationClass.class. A questo punto si pu≥ eseguire l’applicazione lanciando il comando

java ApplicationClass

La seconda categoria Φ quella degli applet. Un applet Φ un oggetto che non pu≥ vivere di vita propria, ma viene eseguito in un contesto ben specifico, e cioΦ all’interno di un browser. Questo vuol dire che un applet non pu≥ essere eseguito singolarmente, ma viene attivata dal caricamento di una pagina Html. Questa caratteristica comporta un vantaggio e uno svantaggio. Il vantaggio Φ che l’applet pu≥ sfruttare quelle che sono le funzionalitα del browser. Per esempio, Φ estremamente semplice per un applet caricare un suono e mandarlo in esecuzione. Per fare la stessa cosa in un’applicazione Φ necessario costruire classi apposite che interagiscano direttamente con il sistema, magari attraverso del codice nativo, cioΦ codice scritto in un altro linguaggio e che pu≥ utilizzare le API del sistema, come, per esempio, il C. Lo svantaggio, Φ che le applet sono state disegnate per essere scaricate dalla Rete, e come tali possono facilmente diventare cavalli di Troia per i sistemi su cui vengono eseguite. Per evitare ci≥, agli applet sono state imposte una serie di limitazioni, specialmente per quello che riguarda l’accesso al sistema e ai dati in esso contenuti. Tali limitazioni non valgono tuttavia per gli applet che vengono caricati da un file-system locale. Un applet Φ sempre una sottoclasse della classe Applet, e prevede l’implementazione di quattro metodi: init(), start(), stop() e destroy(). In realtα, non Φ necessario che un applet implementi qualcuno di questi metodi, anche se poi, di fatto, spesso lo si fa. Il metodo init viene chiamato al momento del caricamento della pagina contenente l’applet e serve per l’inizializzazione. Analogamente il metodo destroy Φ chiamato quando l’applet non serve pi∙, ed Φ quindi utilizzato per liberare eventuali risorse allocate. I due metodi start e stop servono invece a far partire e a fermare il funzionamento dell’applet, e possono anche essere richiamati pi∙ volte mentre la pagina Φ visualizzata. Per esempio, possono servire a far partire e a fermare un’animazione o l’esecuzione di un pezzo musicale. Oltre che a essere richiamati esplicitamente, il metodo start parte automaticamente non appena init ha terminato l’inizializzazione e l’applet Φ pronta per essere eseguita, mentre il metodo stop Φ eseguito automaticamente quando un’altra pagina viene caricata oppure il browser viene ridotto a icona. In genere di questi quattro metodi, quello che raramente s’implementa Φ destroy, che in molti browser Φ richiamato solo quando si chiude definitivamente il browser stesso. Un modello semplificato di applet Φ riportato nel listato 4, mentre il listato 5 riporta una versione avanzata che sfrutta le thread per incrementare le prestazioni nel caricamento della pagina. Attenzione per≥: l’utilizzo di thread cos∞ come quello di pi∙ istanze dello stesso applet nella stessa pagina richiede l’applicazione di alcune tecniche di sincronizzazione non banali per evitare effetti collaterali.

Le limitazioni

In realtα esistono altri metodi che dovrebbero essere implementati quando si sviluppa un applet serio, come getAppletInfo() e getParameterInfo(), ma di questo parleremo quando descriveremo anche come documentare il nostro codice e come utilizzare il comando javadoc. Anche per generare un applet Φ necessario scrivere un file che abbia lo stesso nome della classe ed estensione java, e anche in questo caso si deve usare il comando

javac AppletClass.java

Tuttavia, al contrario di quanto accade con le applicazioni, per eseguire un applet Φ necessario scrivere prima una pagina Html, come quella nel listato 6, e poi caricarla in un browser o lanciare il comando

appletviewer AppletClass.html

Ma quali sono le limitazioni che ha un applet rispetto a un’applicazione?

Al momento, ma le regole sono in continua evoluzione, un applet caricato da un server remoto non pu≥ caricare librerie, utilizzare metodi nativi, leggere o scrivere direttamente file del client, aprire connessioni di rete ad altri sistemi che non siano il server da cui Φ stato caricato, eseguire processi o applicazioni sul client, e leggere alcune proprietα del client che si Φ ritenuto opportuno dovessero rimanere riservate. In pi∙, una finestra aperta da un applet si deve differenziare da una normale finestra di sistema in modo da evitare che qualcuno usi un applet per clonare il pannello di logon di un sistema e catturarne cos∞ le informazioni di accesso (utenza e parola d’ordine). Insomma, le limitazioni sono molte, ma bisogna rendersi conto che gli applet non sono state inventati per creare qualche simpatico effetto speciale sulle nostre pagine Html, bens∞ per fungere da client nei confronti di un’applicazione remota scritta in Java ed eventualmente utilizzante codice nativo, in modo da permettere di usare il browser come vera e propria interfaccia remota cross-platform di applicazioni aziendali.

 

(ddejudicibus@tecnet.it)

 




Internet News Φ un mensile della Casa Editrice Tecniche Nuove S.p.A.
⌐ 1995/96/97. Tutti i diritti sono riservati.
Internet News non risponde di eventuali errori e omissioni.
Commenti a: inews@tecnet.it