Alcune API di base nel JDK J2SE Docente: Gabriele Lombardi [email protected] © 2010 - CEFRIEL The present original document was produced by CEFRIEL and the Teacher for the benefit and internal use of this course, and nobody else may claim any right or paternity on it. No right to use the document for any purpose other than the Intended purpose and no right to distribute, disclose, release, furnish or disseminate it or a part of it in any way or form to anyone without the prior express written consent of CEFRIEL and the Teacher. © copyright Cefriel and the Teacher-Milan-Italy-23/06/2008. All rights reserved in accordance with rule of law and international agreements. © 2010 - CEFRIEL Sommario SLIDE CONTENUTO java.lang.** Features del linguaggio.. nel linguaggio stesso! java.io.* Streams e Input/Output. java.nio.** Un nuovo strumento per l’I/O. java.util.* Un tour dei tool. java.beans.* Cosa sono i fagionlini (magici)? java.applet.* Codice attivo lato client web… senza JavaScript! java.lang.reflect.* Manipolare la struttura interna degli oggetti. © 2010 - CEFRIEL Classi base Tipi di dato builtin (e boxed): true Text – stringhe.. gestione particolare; – boxed-types: “* extends Number” (e non solo). command-pattern con Runnable; iterators con Iterable; eccezioni con la classe Throwable; Comparable, Cloneable, … Processi e thread: – – – – 2 Concetti e interfacce: – – – – 0.1 Containers & Iterators Thread principale gestione dei thread (Thread); gestione dei progessi (Process); Elaborazione 1 il runtime della JVM (Runtime); problemi di concorrenza. Class, ClassLoader e Compiler: – un minimo di reflection si usa sempre! © 2010 - CEFRIEL fork Elaborazione 2 Thread principale join IO e streams Stream come astrazione per l’IO: – – – – uno stream è un canale di Input oppure Output; supporta un’interfaccia indipendente dal behavior; può essere composto con altri stream; permette la scrittura/lettura di dati binari. Reader e Writer: – sono l’astrazione specifica per il testo; – permettono di lavorare con un minimo di formattazione; – permettono di gestire l’encoding. dati Testo stream stream stream Writer storage storage vedere 02_BaseAPIs\IO con: Streams: esempi base Serializables: esempio di serializzazione © 2010 - CEFRIEL NIO: destinazione “efficienza”! Esempio di problemi di efficienza: – si consideri lo stack TCP/IP … – … problemi di copia ripetuta dei dati nei buffer. Soluzione: – metafora del “carrellino” e della “miniera”; – “miniere in fila”, “carrellino ribaltabile”; – passaggio di riferimenti al posto della copia dei dati. Altre utili funzionalità: – encoding/decoding dei dati (testo); – viste multiple di un buffer; – “giochiamoci” un po’! vedere 02_BaseAPIs\NIONostre con: esempio di utilizzo di view-buffers vedere 02_BaseAPIs\Altre\NIO con: esempi vari by Sun Microsystems © 2010 - CEFRIEL java.uti.*: Collections “Algoritmi” + “strutture dati” = programmi: – problema: astrarre (e fornire) gli strumenti per manipolare le strutture dati più comuni: • collezioni, liste, code, insiemi, mappe, … • Collection, List, Queue, Set, Map, … – problema: scegliere l’implementazione desiderata: • ad esempio, scegliere una lista: – LinkedList, Stack, Vector, ArrayList,CopyOnWriteArrayList; • scegliere una mappa: – HashMap, Hashtable, IdentityHashMap, LinkedHashMap, TreeMap, WeakHashMap, ConcurrentHashMap, EnumMap. Navigare in una Collection? – Iterator, ListIterator, Enumeration. Altre classi interessanti: vedere 02_BaseAPIs\Collections con: esempi con Set, Stack, List; esempio di utilizzo degli iteratori – Properties, StringTokenizer, Arrays, Collections, Abstract*. © 2010 - CEFRIEL java.util.*: gestire tempo e formattazione Classi di gestione del tempo: – tipi temporali: • Date, TimeZone, SimpleTimeZone; – strumenti per lavorare con i giorni: • Calendar, GregorianCalendar. Classi per schedulare operazioni: – Timer, TimerTask. Classi per la formattazione di testo: – Formatter, Scanner; Classi per l’internazionalizzazione: – Locale, ResourceBundle; – si veda java.text.*. © 2010 - CEFRIEL vedere 02_BaseAPIs\Timers con: uso classe Timer uso classe Date java.util.** java.util.prefs.* – strumenti per l’accesso a semplici file di configurazione contenenti preferenze di esecuzione; – formati supportati: classico e XML. java.util.logging.* – strumenti per la generazione e gestione di messaggi di log. java.util.concurrent.* – strumenti per affrontare problematiche di concorrenza. java.util.zip/jar.* – creazione/analisi di file compressi. java.util.regex.* – espressioni regolari Perl-like. java.text.* – analisi/generazione di messaggi di testo formattato. © 2010 - CEFRIEL JavaBeans JavaBeans: – semplici POJO con: • costruttore di default: – senza parametri affinché possano essere istanziati; • proprietà: – rappresentate da metodi getter e setter; – una proprietà “prop” deve avere: » un getter “public type getProp();” se è read; » un setter “public void setProp(type val);” se è write; – rappresentano: • entità reali a cui sono associate proprietà; – possono essere gestiti: • tramite le API contenute in “java.beans.*”; – vengono utilizzati: • per moltissimi scopi (essendo generali); • per la descrizione di entità grafiche in Swing; • per la definizione di Entity beans (in JPA). © 2010 - CEFRIEL java.applet.* Cosa sono: – estensioni della classe java.applet.Applet; – componenti grafiche inseribili ovunque … • … non solo in una pagina web!!! – (infatti estendono java.awt.Panel) – applicazioni da “embeddare” in altre applicazioni. A cosa servono: – per essere incluse in un’altra applicazione … • … come un browser! Si usano ancora? – poco e quasi “no”; vedere 02_BaseAPIs\Altre\Applet – limitate per problemi di sicurezza! © 2010 - CEFRIEL Scopo: java.lang.reflect.* – permettere a codice scritto in Java di manipolare entità semantiche del linguaggio stesso: • classi, metodi, attributi, … – fornisce uno strumento di meta-programmazione formidabile e fondamentale … e usatissimo in pratica! Caratteristiche: – flessibilissimo … entro il possibile (Generics?); – non particolarmente efficiente: • meno rispetto al codice nativo; • non drammatico … ma da non usare per applicazioni di tipo real-time o time-critical. vedere 02_BaseAPIs\Reflection con: uso della reflection; esempio giocattolo di astrazione di entity persistenti utilizzo massiccio di collections (Map) © 2010 - CEFRIEL Esempi già esistenti Consiglio vivamente di: – analizzare degli esempi già esistenti: • cercare di identificare i pattern e le decisioni architetturali importanti; • isolare le singole collaborazioni per poterle analizzare separatamente (anche come codice); – provare a sviluppare dei propri esempi complessi: • • • • • partire dall’idea generale e spezzarla in sottoproblemi; identificarne una parte relativamente piccola; descrivere in UML i casi d’uso della parte; identificare le classi che entrano in gioco e le loro collaborazioni; scegliere una collaborazione alla volta ed implementarla creando o modificando le classi implicate (refactoring, si veda Fowler). Guardare ad esempio: – 02_BaseAPIs\Altre\SimulationEngine • framework di simulazione di apparati (non completo); – 02_BaseAPIs\Altre\DMS • framework di gestione documantale (beta-version); – doc. in UML tramite ArgoUML o Visio: • guardare nella cartella “Docs”; • scaricare ed installare ArgoUML, è open-source. • scaricare il visualizzatore Visio gratuito. © 2010 - CEFRIEL