Java codestyle & tipstricks
-
Upload
domenico-briganti -
Category
Documents
-
view
481 -
download
0
Transcript of Java codestyle & tipstricks
Java Code Conventions Java Tips & Tricks
Italtel, Italtel logo and iMSS (Italtel Multi-Service Solutions) are registered trademarks owned by Italtel S.p.A. All other trademarks mentioned in this document are property of their respective owners. Italtel S.p.A. cannot guarantee the accuracy of the information presented, which may change without notice. All contents are © Copyright 2006 Italtel S.p.A. - All rights reserved.
Domenico Briganti
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Agenda
Java Code Style
Analisi statica del codice con FindBug e PDM – Demo
Profiling di applicazione Java con JRockit - Demo
Debug Remoto (JPDA) – Demo
Demo Ant, JUnit, Cobertura, CheckStyle
Java Tips & Tricks
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Attenzione!!
Nelle slide che state per vedere ci sono degli
errori inseriti di proposito, attenzione!!!
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style
Sono una serie di raccomandazioni edita dalla community di sviluppatori Java basate su esperienze, requisiti locali e/o richiesti, suggerimenti per uniformare e rendere più leggibile il codice scritto in Java.
Molti IDE oggi hanno funzionalità di color coding, formattazione automatica, ecc. ma non bisogna affidarsi solo a queste, ci sono molte occasioni in cui non si dispone di ambienti evoluti ed un corretto stile di programmazione aiuta la lettura e la comprensione del codice.
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 1/10
I nomi dei package dovrebbero essere scritti in minuscolo e la parte
iniziale dovrebbe rappresentare un dominio.
Es:
com.italtel.ims.presence Dominio
Progetto
Modulo
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 2/10
I nomi che rappresentano Tipi (quindi classi e interfacce) devono avere
la prima lettera maiuscola.
I nomi che rappresentano variabili devono avere la prima lettera
minuscola.
I nomi che rappresentano costanti (quindi col modificatore final) devono
essere scritti in maiuscolo e con un underscore per separare le parole:
es. COLOR_RED.
I metodi devono iniziare con un carattere minuscolo.
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Numeri
int i = 012;
System.out.println(i);
a) 12b) 012c) 10d) Nessuno di
questi
Risultato?
C
Con lo “0” davanti, il numeroè un ottale.
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 3/10
In genere è buona norma usare variabili con lo stesso nome del tipo:void setTopic(Topic topic) // NO: void setTopic(Topic value)
// NO: void setTopic(Topic aTopic)
// NO: void setTopic(Topic t)
void connect(Database database) // NO: void connect(Database db)
// NO: void connect(Database oracleDB)
Tutti i nomi e commenti dovrebbero essere in inglese.
Il nome dell’oggetto su cui si applica un metodo è implicito, evitare di
ripeterlo nel metodo:line.getLength(); // NO: line.getLineLength();
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 4/10
Evitare complesse espressioni nelle clausole if:bool isFinished = (elementNo < 0) || (elementNo > maxElement);
bool isRepeatedEntry = elementNo == lastElement;
if (isFinished || isRepeatedEntry)
{ : }
// NO:
if ((elementNo < 0) || (elementNo > maxElement)|| elementNo == lastElement)
{ : }
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 5/10
Evitare i commenti nella stessa riga dell’istruzione:int rotLength = Integer.parseInt(rotationLengthField.getText().trim()); // get rot lenRotAscii cipher = new RotAscii(rotLength); // new ciphertextArea.setText(cipher.transform(textArea.getText())); // transform
Meglio: // Get rotation length field and convert to integer.rotLength = Integer.parseInt(rotationLengthField.getText().trim()); // Create ASCII rotation cipher and transform the user's text with it.cipher = new RotAscii(rotLength);textArea.setText(cipher.transform(textArea.getText()));
Evitare commenti inutili:prep.registerPreparser(W3C_XML_SCHEMA, loader);// registro il loader nel preparserprep.setEntityResolver(wr);// setto nel preparser l'entity resolverXMLGrammarPool p = new XMLGrammarPoolImpl();// creo la GrammarPool
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Operazione aritmetiche
int a = 8;
int b = 3;
float f = a++/b--;
System.out.println(f);
a) 3.0b) 4.5c) 2.0d) 2.6
Risultato?
C
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 6/10
Usare get/set per accedere direttamente agli attributi Usare isXXX per ritornare variabili booleane. Usare computeXXX dove c’è quancosa da calcolare. Usare findXXX per i metodi che effettuano una ricerca e initializeXXX
per inizializzare oggetti (è sconsigliato l’uso di initXXX). Usare nome plurali per le collezioni. Usare variabili chiamate i, j, k ecc. nei cicli for.
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 7/10
Le classi che estendono da Exception devono essere chiamate
XXXException.
L’implementazione di default di un’interfaccia deve iniziare col nome
DefaultXXX.
Importare le classi esplicitamente:import java.util.List; // NO: import java.util.*;
import java.util.ArrayList;
import java.util.HashSet;
(In eclipse Ctrl+Shift+O)
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 8/10
Le classi Singleton devono avere il metodo getInstance() per ritornare se stesse e avere il costruttore privato.
L’Array specifiers deve essere associato al tipo e non alla variabile:
int[] a = new int[20]; // NO: int a[] = new int[20]
È buona norma usare cast espliciti per indicare l’effettiva volontà del programmatore:
floatValue = (int) intValue; // NO: floatValue = intValue;
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Stringhe
String s1 = “aaa”;
s1.concat(“bbb”);
System.out.println(s1);
a) “aaa”b) “aaabbb”c) “bbbaaa”d) “bbb”e) Non compila
Risultato?
A
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 9/10
Le variabili dovrebbero essere inizializzare dove sono state dichiarate e
devono avere il minore scope possibile.
Le variabili non devono avere più significati, no al riuso di una variabile
per scopi diversi.
Variabili statiche o metodi statici di devono riferire sempre alla classe e
non ad un’istanza:Thread.sleep(1000); // NO: thread.sleep(1000);
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style 10/10
Evitare di usare break e continue nei cicli e return in mezzo alle funzioni
(quando migliorano la leggibilità vanno bene).
Usare sempre le parentesi graffe.
Mettere nel blocco if l’operazione più eseguita rispetto a quella del
blocco else.
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style Riepilogo
Questa è una breve carrellata dei punti più importati delle raccomandazioni,
per un elenco esaustivo vedere:
http://www.codestyle.org/
http://geosoft.no/development/javastyle.html
http://java.sun.com/docs/codeconv/
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style Tools
Checkstyle è un tool che aiuta il programmatore a mantenere il codice
congruente agli stili selezionati per il controllo.
Esiste un plugin per eclipse:
http://eclipse-cs.sourceforge.net/
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style DEMO Classe sottoposta alla verifica
public class ClassPathHacker {
private static final Class[] parameters = new Class[] { URL.class };
public static void addFile(String s) throws IOException {
File f = new File(s);
addFile(f);
}
public static void addURL(URL u) throws IOException {
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[] { u });
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Code Style DEMO Risulatato della verifica
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Debug Remoto (JPDA) - Demo
Java Platform Debugger Architecture dalla 1.3
java …… -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n ……
che significano:
-Xdebug abilita il debugging
-Xrunjdwp contiene la lista delle variabili per configurare jpda:
transport=dt_socket la VM aspetta le connessioni tramite socket.
address=8000e' la porta TCP di ascolto
server=y la VM si deve comportare da server
suspend=n la VM non deve sospendere il programma nell'attesa di una connesione remota
Java Platform Debugger Architecture - JPDA Connection and Invocation
Remote debugging con eclipse
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Ant con JUnit Cobertura e CheckStyle
DEMO
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
FindBug e PDM
DEMO
Link per il siteupdate di eclipse
http://findbugs.cs.umd.edu/eclipse
http://pmd.sf.net/eclipse
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Java Tips & Tricks
Gestione delle eccezioni
Gestione della memoria e Garbage Collection
Classico errore unsupportedJavaVersion (49.0)
Domande & Risposte
Alcuni Pattern Famosi
Gestione delle risorse
Gestione dei thread e loro sincronizzazione
Parser XML Sax e Dom
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
La gerarchia di classe delle eccezioni
Object
Throwable
ErrorException
LinkageError
Virtual MachineError
AWTError
RuntimeException
ClassNotFoundException
NullPointerException
IndexOutOfBoundException
ArthemticException
NoSuchMethodException
Eccezioni non controllate
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Eccezioni checked e unchecked
se una procedura può sollevare una eccezione checkeddeve elencarla nel suo header
che fa parte anche della specificaaltrimenti si verifica un errore a tempo di compilazione
se una procedura può sollevare una eccezione uncheckedpuò non elencarla nel suo header
il suggerimento è di elencarla sempre, per rendere completa la specifica
se una procedura chiamata da p ritorna sollevando una eccezionese l’eccezione è checked
p deve gestire l’eccezione (try and catch, vedi dopo)se l’eccezione (o uno dei suoi supertipi) è elencata tra quelle
sollevabili da p, può essere propagata alla procedura che ha chiamato p
se l’eccezione è uncheckedpuò essere comunque gestita o propagata
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL9
Catch annidati e blocco finally
Exception Handling:
try {
code that may generate exception;
} catch (Exception1 e1) {
code to handle exception of type Exception1;
} catch( ….
} catch (ExceptionN eN) {
code to handle exception of type ExceptionN;
} finally {
code that are guaranteed to be executed before (normally or abnormally) leaving this try-catch
statement;
}
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
main() :
…demo.level1()…
level1() :…try{ …level2() …}catch(ArithmeticException p){…} ….
level2() :
…level3()…
level3() :…
c = c / 0; // divided by zero…
normal flow exception flow
Exception propagation
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
C’è qualcosa che non va nel codice sotto?
public synchronized void initGrammarParser() {
try {
CustomLogger.logmsg(CustomLogger.NOTICE, "PresenceParser.initGrammarParser: Initializing XML Grammar Pool");
grammarBucket.clear();
Iterator it = xsdFileList.iterator();// per tutti i file xsd
Iterator it2 = listNamespace.iterator();
while (it.hasNext()) {
String xsd = (String) it.next();// leggo il nome del file
src.setByteStream(stream);
SchemaGrammar g = (SchemaGrammar) prep.preparseGrammar(W3C_XML_SCHEMA, src);// parsing dell'xsd
grammarBucket.put(g.getTargetNamespace(), g);// aggiungo la grammatica al bucket
}
} catch (Exception e) {
CustomLogger.logmsg(CustomLogger.NOTICE, "PresenceParser.initGrammarParser: Unable to initialize Grammar Parser");
prep = null;
}
}
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Quando usare le eccezioni
le eccezioni non sono necessariamente errori ma metodi per richiamare l’attenzione del chiamante su situazioni particolari
(classificate dal progettista come eccezionali) comportamenti che sono errori ad un certo livello, possono non esserlo affatto a livelli
di astrazione superioreIndexOutOfBoundsException segnala chiaramente un errore
all’interno dell’espressione a[0] ma non necessariamente per le procedure min e sort
il compito primario delle eccezioni è di ridurre al minimo i vincoli della clausola REQUIRES nella specifica dovrebbe restare solo se
la condizione è troppo complessa da verificare (efficienza)il contesto d’uso limitato del metodo (private) ci permette di convincerci che
tutte le chiamate della procedura la soddisfano vanno usate per evitare di codificare informazione su terminazioni particolari nel
normale risultato
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Gestione della memoria e Memory Leak
Java Memory leak
AllocatedReachable
Live
Handled by JVM
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
UnsupportedClassVersionError (Unsupported major.minor version 49.0)
Il problema: avete compilato con Java 1.5 senza specificare il target (1.4) e state cercando di
eseguire il codice con Java 1.4.
A volte non sappiamo nemmeno noi come le nostre classi compilano (in Eclipse fare ed
eseguite un progettino, dove andare a vedere quale runtime usa eclipse per compilare?).
Come sapere per quale versione di Java sono state compilate le nostre classi?
file http://prdownloads.sourceforge.net/gnuwin32/file-4.16-1.exe (sotto linux è già presente)
$ file Hello.class
Hello.class: compiled Java class data, version 49.0
Magic mumber classi java 0xCAFEBABE
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Metodo equals
public class Equals extends TestCase {
public void testEquals() {
MioValore val1 = new MioValore("1", 1);
MioValore val2 = new MioValore("1", 1);
assertEquals(val1, val2);
}
class MioValore {
public String val1;
public Integer val2;
public MioValore(String val1, Integer val2) {
this.val1 = val1;
this.val2 = val2;
}
@Override public boolean equals(Object obj) { if (obj instanceof MioValore) { MioValore valore = (MioValore) obj; if (valore.val1.equals(val1) &&
valore.val2.equals(val2)) return true; } return false; }
Quale risultato si ottiene?Come Procedere in questo caso?
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Metodo Clone – Shallow copy e deep copy
Vector original = new Vector();
StringBuffer text = new StringBuffer("The quick brown fox");
original.addElement(text);
Vector clone = (Vector) original.clone();
Modifico la stringa text dentro original e aggiuno un intero al vettore…text.append(" jumps over the lazy dog.");
original.addElement(new Integer(5));
Che succede? Che contenuto avrà l’oggetto clone?
Clone = {(“The quick brown fox jumps over the lazy dog”)}
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Argomenti a linea di comando
java AnyProg Well Done
public class AnyProg {
public static void main(String[] argv) {
System.out.println(argv[2]);
}
}
a) AnyProg
b) Well
c) Done
d)ArrayIndexOutOfBoundException
Risultato?
D
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
StringBuilder
Se si fanno delle operazione sulle stringhe è consigliato usare la classe StringBuilder():
String a = “Ciao ”;
a += “come stai ”
a += “oggi”;
StringBuilder a = new StringBuilder(“Ciao ”);
a.append(“come stai ”);
a.append(“oggi”);
Perché è preferibile StringBuilder?
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Keyword synchronized
a) Permette a due processi in esecuzione di comunicare tra di loro
b) Garantisce che sono un thread per volta può accedere al metodo/oggetto
c) Garantisce che due o più processi partiranno/arresteranno allo stesso tempo
d) Garantisce che due o più thread partiranno/arresteranno allo stesso tempo
B
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Thread
public class MyThread extends Thread {
public int run(int time) {
System.our.println(“run()”);
return 5;
}
public static void main(String[] argv) {
new MyThread().start();
}
}
a) Errore di Compilazione
b) Runtime Errorc) “run()”d) Nessun output
Risultato?
D
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Overloading
Public class Test {
public static void main(String[] argv) {
print();
}
public static void print() {
System.out.println(“a”);
}
public void print() {
System.out.println(“b”);
}
}
a) Il codice compila e ritorna “a”b) Il codice compila e ritorna “b”c) Non compila per un errore di
metodo duplicatod) Il codice non compila per un
errore reference, richiamato metodo non statico in un contestostatico
C
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Polimorfismo
public class Animale {
public void interroga() { System.out.println(“Grunt”); }
}
public class Ghepardo extends Animale {
public void interroga() { System.out.println(“Groar!”); }
}
Ghepardo g = new Ghepardo();
Animale a = (Animale) g;
System.out.println(a.interroga());
a) ClassCastEx..b) Gruntc) Groar!d) Non compila
Risultato?
C
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Sovrascrittura di metodi
Class Test {
void show() { …}
}
public class Q3 extends Test {
static void show() {…}
public stati void main(String[] argv) {
Q3 q3 = new Q3();
qe.show();
}
}
a) Errore qui
b) Errore qui
c) Runtime Exception
Risultato?
B
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Interfacce
Public interface MyClass {
void myMethod();
}
La classe che implementa questa interfaccia…
a) Deve avere per forza il metodo myMethod come public
b) Deve avere per forza il metodo myMethod come public o friendly
c) Deve avere per forza il metodo myMethod che non solleva checked exception
d) Deve avere per forza il metodo myMethod non sincronizzato
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Classi e variabili Final
Una classe final può ereditare da un’altra?
Una classe dichiarata final può avere metodi astratti?
Una variabile final può cambiare valore?
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Costruttori
Quando si ottiene il costruttore di default?
a) Quando si definisce una classe
b) Quando la classe non ha costruttori
c) Quando si definisce almeno un costruttore
d) Mai
B
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Ereditarietà
public static void main(String[] argv) {
System.out.println("Main");
classB c = new classB();
}
class classB extends classC {
public classB() {System.out.println("B");} }
class classA {
public classA() {System.out.println("A");} }
class classC extends classA {
public classC() {System.out.println("C");} }
a) C,B,B,Main
b) Main,A,C,B
c) Main,A,B,C
d) Main,A,B,A
Risultato?
B
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Switch
public void metodo() {
int k = 10;
switch (k) {
default:
System.out.println("default");
break;
case 10:
System.out.println(10);
case 20:
System.out.println(20);
break;
}
}
a) Output “default”
b) Output “10 20”
c) Non compila
d) Nessuna di queste
Risultato?
B
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Garbage Collection
String s = “abcd”;
Integer x = new Integer(3);
String s2 = s + 4;
s2 = null;
s = null;
Quando s2 è disponibile per la garbage collection?
a) Linea 5 b) Non è possibile saperlo
c) Linea 4 d) Fin quando il threan non termina
C
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Passaggio per Valore o per Riferimento
class Value { public int i = 15; }
public static void main(String[] argv) {
ValoreRiferimento vr = new ValoreRiferimento();
vr.first();
}
public void first() {
int i = 5; Value v = new Value(); v.i = 25;
second(v, i); System.out.println(v.i);
}
public void second(Value v, int i) {
i = 0; v.i = 20; Value val = new Value();
v = val; System.out.println(v.i + " " + i);
}
a) 15 0 20
b) 15 0 15
c) 20 0 20
d) 0 15 20
Risultato?
A
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Assegnamento
public class Assegnamento {
static {
int x = 5;
}
static int x, y;
public static void main(String[] argv) {
x--;
mioMetodo();
System.out.println(x + y + ++x);
}
public static void mioMetodo() {
y = x++ + ++x;
}
}
Risultato?
3
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Instanze di oggetti e campi statici
Class MyClass {
static String myName = “SCJP”;
MyClass getMyClass() {
System.out.println(myName);
return null;
}
public static void main(String[] argv) {
System.out.println(new MyClass().getMyClass().myName);
}
}
a) Output “SCJP” x 2
b) Output “SCJP”
c) Non compila
d) NullPointerExc…
Risultato?
A
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Cosa e’ un pattern? 1/2
E’ possibile pensare ad un pattern come un modo di risolvere una particolare classe di problemi.
Un design pattern e’ una descrizione di come devono comunicare oggetti e classi che saranno customizzate per risolvere un problema generale di design in un particolare contesto.
Serve per aggiungere un maggiore livello di astrazione all’architettura del progetto ed a modellizzare meglio gli oggetti e le interazioni tra gli oggetti
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Cosa e’ un pattern? 2/2
Non descrive un concreto design ne una concreta implementazione Serve a sviluppare un progetto in modo elegante e facile da mantenere Aiuta i nuovi progettisti meno esperti ad avere un design piu flessibile e riusabile L’obbiettivo dei design patterns e’ isolare i cambiamenti nel codice in modo da rendere
facile l’evoluzione del progetto
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Classificazione 1/2
Creational: definisce la modalita’ di creazione degli oggetti
Structural: definisce l’aggregazione di oggetti per formare structure piu vaste
Behavioral: definisce gli oggetti per soddisfare particolari vincoli nel loro
comportamento
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Classificazione 2/2
Creational: Factory, Singleton, Builder,
Prototype Structural: Adapter, Bridge, Composite,
Decorator, Facade, Flyweight, Proxy
Behavioral: Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template, Visitor
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Observer 1/3
Il pattern observer risolve un comune problema: cosa fare se un gruppo di oggetti necessitano di essere aggiornati quando altri oggetti cambiano stato?
Il cambiamento di un oggetto provoca dinamicamente il cambiamento di altri oggetti. Un oggetto dovrebbe poter notificare ad altri oggetti il cambiamento del proprio stato
senza conoscere nulla sulla loro identità. Il meccanismo ad eventi di AWT e’ implementato addottando il pattern Observer.
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Observer 2/3
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Observer 3/3
public interface Observer { public void update( Subject subject ) ;
} public class Subject {
protected Vector observers = new Vector() ;
public void addObserver( Observer o ) { observers.addElement( o ) ;
}
public void removeObserver( Observer o ) { observers.removeElement( o ) ;
}
public void notify() { Enumeration e = observers.getElements() ; while ( e.hasMoreElements() ) { ((Observer)e.nextElement()).update( this ) ; }
} }
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Factory 1/4
Il pattern Factory definisce una interfaccia per la creazione di un oggetto, ma lascia alle
sottoclassi la decisione su che classe istanziare.
Fornisce un’interfaccia per la creazione di oggetti senza specificare la loro classe.
Il pattern Factory e’ applicabile in tutti quei casi in cui si vuole centralizzare la decisione
di quale classe istanziare.
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Factory 2/4
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Factory 3/4
public interface AbstractFactory {public AbstractProductA createProductA();public AbstractProductB createProductB();
}public class ConcreteFactory1 implements AbstractFactory {
public AbstractProductA createProductA() {return (AbstractProductA ) new ProductA1();
}public AbstractProductB createProductB() {
return (AbstractProductB ) new ProductB1();}
public class ConcreteFactory2 implements AbstractFactory {public AbstractProductA createProductA() {
return (AbstractProductA ) new ProductA2();}public AbstractProductB createProductB() {
return (AbstractProductB ) new ProductB2();}
}
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Factory: 4/4
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Proxy 1/4
Il pattern Proxy fornisce un sostituto di un oggetto per controllare l’accesso ad esso.
Un remote proxy puo nascondere il fatto che l’oggetto risiede in un altro server
CORBA ed RMI (Remote Method Interface) sono implementati tramite il Pattern Proxy.
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Proxy 2/4
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Proxy 3/4
abstract class Subject { abstract public void Request(); }class RealSubject extends Subject {
public void Request() { // do something } }class ProxySubject extends Subject { private RealSubject _subject = null; public void Request() { if (_subject == null) {
_subject = new RealSubject(); } _subject.Request(); } }
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Proxy 4/4
// Share interface client/serverpublic interface Action {
public void doAction();}
// Remote action (on server)public class ConcreteAction implements Action {
public void doAction() {//...
}}
// Client proxypublic class ActionStub implements Action {
public void doAction() {// Send Tcp/Ip order for calling remote doAction
}}
Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL
Più interfacce sulla stessa macchina
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
NetworkInterface i = e.nextElement();
Enumeration<InetAddress> ie = i.getInetAddresses();
if (ie.hasMoreElements()) {
InetAddress lch = ie.nextElement();
System.out.println(lch);
if (lch.isLoopbackAddress())
System.out.println("SOPRA - Indirizzo di loopback");
}
}