Java codestyle & tipstricks

651 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
651
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • 1- At the beginning of GC cycle, objects that are allocated but no longer reachable are reclaimed by the Garbage collector.
  • Java codestyle & tipstricks

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

    ×