java codestyle & tipstricks

67
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

Upload: domenico-briganti

Post on 19-May-2015

492 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

Page 2: Java codestyle & tipstricks

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

Page 3: Java codestyle & tipstricks

Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL

Attenzione!!

Nelle slide che state per vedere ci sono degli

errori inseriti di proposito, attenzione!!!

Page 4: Java codestyle & tipstricks

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.

Page 5: Java codestyle & tipstricks

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

Page 6: Java codestyle & tipstricks

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.

Page 7: Java codestyle & tipstricks

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.

Page 8: Java codestyle & tipstricks

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();

Page 9: Java codestyle & tipstricks

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)

{ : }

Page 10: Java codestyle & tipstricks

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

Page 11: Java codestyle & tipstricks

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

Page 12: Java codestyle & tipstricks

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.

Page 13: Java codestyle & tipstricks

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)

Page 14: Java codestyle & tipstricks

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;

Page 15: Java codestyle & tipstricks

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

Page 16: Java codestyle & tipstricks

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);

Page 17: Java codestyle & tipstricks

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.

Page 18: Java codestyle & tipstricks

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/

Page 19: Java codestyle & tipstricks

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/

Page 20: Java codestyle & tipstricks

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");

}

Page 21: Java codestyle & tipstricks

Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL

Java Code Style DEMO Risulatato della verifica

Page 22: Java codestyle & tipstricks

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

Page 23: Java codestyle & tipstricks

Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL

Ant con JUnit Cobertura e CheckStyle

DEMO

Page 24: Java codestyle & tipstricks

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

Page 25: Java codestyle & tipstricks

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

Page 26: Java codestyle & tipstricks

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

Page 27: Java codestyle & tipstricks

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

Page 28: Java codestyle & tipstricks

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;

}

Page 29: Java codestyle & tipstricks

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

Page 30: Java codestyle & tipstricks

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;

}

}

Page 31: Java codestyle & tipstricks

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

Page 32: Java codestyle & tipstricks

Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL

Gestione della memoria e Memory Leak

Java Memory leak

AllocatedReachable

Live

Handled by JVM

Page 33: Java codestyle & tipstricks

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

Page 34: Java codestyle & tipstricks

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?

Page 35: Java codestyle & tipstricks

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”)}

Page 36: Java codestyle & tipstricks

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

Page 37: Java codestyle & tipstricks

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?

Page 38: Java codestyle & tipstricks

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

Page 39: Java codestyle & tipstricks

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

Page 40: Java codestyle & tipstricks

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

Page 41: Java codestyle & tipstricks

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

Page 42: Java codestyle & tipstricks

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

Page 43: Java codestyle & tipstricks

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

Page 44: Java codestyle & tipstricks

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?

Page 45: Java codestyle & tipstricks

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

Page 46: Java codestyle & tipstricks

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

Page 47: Java codestyle & tipstricks

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

Page 48: Java codestyle & tipstricks

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

Page 49: Java codestyle & tipstricks

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

Page 50: Java codestyle & tipstricks

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

Page 51: Java codestyle & tipstricks

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

Page 52: Java codestyle & tipstricks

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

Page 53: Java codestyle & tipstricks

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

Page 54: Java codestyle & tipstricks

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

Page 55: Java codestyle & tipstricks

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

Page 56: Java codestyle & tipstricks

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.

Page 57: Java codestyle & tipstricks

Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL

Observer 2/3

Page 58: Java codestyle & tipstricks

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 ) ; }

} }

Page 59: Java codestyle & tipstricks

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.

Page 60: Java codestyle & tipstricks

Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL

Factory 2/4

Page 61: Java codestyle & tipstricks

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();}

}

Page 62: Java codestyle & tipstricks

Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL

Factory: 4/4

Page 63: Java codestyle & tipstricks

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.

Page 64: Java codestyle & tipstricks

Unità – area aziendale - CONFIDENTIALUnità – area aziendale - CONFIDENTIAL

Proxy 2/4

Page 65: Java codestyle & tipstricks

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(); } }

Page 66: Java codestyle & tipstricks

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

}}

Page 67: Java codestyle & tipstricks

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");

}

}