際際滷

際際滷Share a Scribd company logo
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
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
Attenzione!! Nelle slide che state per vedere ci sono degli errori inseriti di proposito, attenzione!!!
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.
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
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.
Numeri int i = 012; System.out.println(i); 12 012 10 Nessuno di questi Risultato? C Con lo 0 davanti, il numero 竪 un ottale.
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 delloggetto su cui si applica un metodo 竪 implicito, evitare di ripeterlo nel metodo: line.getLength();  // NO: line.getLineLength();
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) { : }
Java Code Style 5/10 Evitare i commenti nella stessa riga dellistruzione: int rotLength = Integer.parseInt(rotationLengthField.getText().trim()); // get rot len RotAscii cipher = new RotAscii(rotLength); // new cipher textArea.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 preparser prep.setEntityResolver(wr);// setto nel preparser l'entity resolver XMLGrammarPool p = new XMLGrammarPoolImpl();// creo la GrammarPool
Operazione aritmetiche int a = 8; int b = 3; float f = a++/b--; System.out.println(f); 3.0 4.5 2.0 2.6 Risultato? C
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 luso di initXXX). Usare nome plurali per le collezioni. Usare variabili chiamate i, j, k ecc. nei cicli for.
Java Code Style 7/10 Le classi che estendono da Exception devono essere chiamate XXXException. Limplementazione di default di uninterfaccia 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)
Java Code Style 8/10 Le classi Singleton devono avere il metodo getInstance() per ritornare se stesse e avere il costruttore privato. LArray 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 leffettiva volont del programmatore: floatValue = (int) intValue;  // NO: floatValue = intValue;
Stringhe String s1 = aaa; s1.concat(bbb); System.out.println(s1);  aaa  aaabbb  bbbaaa  bbb Non compila Risultato? A
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 unistanza: Thread.sleep(1000);  // NO: thread.sleep(1000);
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 loperazione pi湛 eseguita rispetto a quella del blocco else.
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/
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 /
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(&quot;addURL&quot;,  parameters ); method.setAccessible(true); method.invoke(sysloader, new Object[] { u }); } catch (Throwable t) { t.printStackTrace(); throw new IOException(&quot;Error, could not add URL to system classloader&quot;); }
Java Code Style DEMO Risulatato della verifica
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
Ant con JUnit Cobertura e CheckStyle DEMO
FindBug e PDM DEMO Link per il siteupdate di eclipse http:// findbugs.cs.umd.edu / eclipse   http://pmd.sf.net/eclipse
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
La gerarchia di classe delle eccezioni Object Throwable Error Exception LinkageError Virtual MachineError AWTError RuntimeException ClassNotFoundException NullPointerException IndexOutOfBoundException ArthemticException NoSuchMethodException Eccezioni non controllate
Eccezioni checked e unchecked se una procedura pu嘆 sollevare una eccezione checked deve elencarla nel suo header che fa parte anche della specifica altrimenti si verifica un errore a tempo di compilazione se una procedura pu嘆 sollevare una eccezione unchecked pu嘆 non elencarla nel suo header il suggerimento 竪 di elencarla sempre, per rendere completa la specifica se una procedura chiamata da  p  ritorna sollevando una eccezione se leccezione 竪 checked p deve  gestire  leccezione ( try   and   catch , vedi dopo) se leccezione (o uno dei suoi supertipi) 竪 elencata tra quelle sollevabili da  p ,  pu嘆 essere  propagata  alla procedura che ha chiamato  p se leccezione 竪 unchecked pu嘆 essere comunque gestita o propagata
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; } 9
Exception propagation main() :  demo.level1()  level1() :  try{  level2()  } catch( ArithmeticException p) {}  . level2() :  level3()  level3() :  c = c / 0;  // divided by zero  normal flow exception flow
C竪 qualcosa che non va nel codice sotto? public synchronized void initGrammarParser() { try { CustomLogger.logmsg(CustomLogger.NOTICE, &quot;PresenceParser.initGrammarParser: Initializing XML Grammar Pool&quot;); 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, &quot;PresenceParser.initGrammarParser: Unable to initialize Grammar Parser&quot;); prep = null; } }
Quando usare le eccezioni le eccezioni non sono necessariamente errori  ma metodi per richiamare lattenzione 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 superiore IndexOutOfBoundsException  segnala chiaramente un errore allinterno dellespressione  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 duso 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
Gestione della memoria e Memory Leak Java Memory leak Allocated Reachable Live Handled by JVM
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
Metodo equals  public class Equals extends TestCase { public void testEquals() { MioValore val1 = new MioValore(&quot;1&quot;, 1); MioValore val2 = new MioValore(&quot;1&quot;, 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?
Metodo Clone  Shallow copy e deep copy Vector original = new Vector(); StringBuffer text = new StringBuffer(&quot;The quick brown fox&quot;); original.addElement(text); Vector clone = (Vector) original.clone(); Modifico la stringa text dentro original e aggiuno un intero al vettore text.append(&quot; jumps over the lazy dog.&quot;); original.addElement(new Integer(5)); Che succede? Che contenuto avr loggetto clone? Clone = {( The quick brown fox  jumps over the lazy dog )}
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
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?
Keyword  synchronized Permette a due processi in esecuzione di comunicare tra di loro Garantisce che sono un thread per volta pu嘆 accedere al metodo/oggetto Garantisce che due o pi湛 processi partiranno/arresteranno allo stesso tempo Garantisce che due o pi湛 thread partiranno/arresteranno allo stesso tempo B
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(); } } Errore di Compilazione Runtime Error  run() Nessun output Risultato? D
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); } } Il codice compila e ritorna a Il codice compila e ritorna b Non compila per un errore di  metodo duplicato Il codice non compila per un  errore reference, richiamato  metodo non statico in un contesto statico C
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());   ClassCastEx.. Grunt Groar! Non compila Risultato? C
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
Interfacce Public interface MyClass { void myMethod(); } La classe che implementa questa interfaccia Deve avere per forza il metodo myMethod come public Deve avere per forza il metodo myMethod come public o friendly Deve avere per forza il metodo myMethod che non solleva checked exception Deve avere per forza il metodo myMethod non sincronizzato
Classi e variabili Final Una classe final pu嘆 ereditare da unaltra? Una classe dichiarata final pu嘆 avere metodi astratti? Una variabile final pu嘆 cambiare valore?
Costruttori Quando si ottiene il costruttore di default? Quando si definisce una classe Quando la classe non ha costruttori Quando si definisce almeno un costruttore Mai B
Ereditariet public static void main(String[] argv) { System. out .println(&quot;Main&quot;); classB c = new classB(); } class classB extends classC { public classB() {System. out .println(&quot;B&quot;);}  } class classA { public classA() {System. out .println(&quot;A&quot;);}  } class classC extends classA { public classC() {System. out .println(&quot;C&quot;);}  } a) C,B,B,Main b) Main,A,C,B c) Main,A,B,C d) Main,A,B,A Risultato? B
Switch  public void metodo() { int k = 10; switch (k) { default: System. out .println(&quot;default&quot;); 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
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? Linea 5 b) Non 竪 possibile saperlo c) Linea 4 d) Fin quando il threan non termina C
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 + &quot; &quot; + i); } a) 15 0 20 b) 15 0 15 c) 20 0 20 d) 0 15 20 Risultato? A
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
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
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 allarchitettura del progetto ed a modellizzare meglio gli oggetti  e le interazioni tra gli oggetti
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 Lobbiettivo dei design patterns e isolare i cambiamenti nel codice in modo da rendere facile levoluzione del progetto
Classificazione  1/2 Creational:  definisce la modalita di creazione degli oggetti Structural:  definisce laggregazione di oggetti per formare structure piu vaste Behavioral:  definisce gli oggetti per soddisfare particolari vincoli nel loro comportamento
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
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.
Observer 2/3
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  ) ;  }   } }
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 uninterfaccia 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.
Factory 2/4
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(); } }
Factory:  4/4
Proxy 1/4 Il pattern Proxy fornisce un sostituto di un oggetto per controllare laccesso ad esso. Un  remote proxy  puo nascondere il fatto che loggetto risiede in un altro server CORBA ed RMI (Remote Method Interface)  sono implementati tramite il Pattern  Proxy.
Proxy 2/4
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();  }  }
Proxy 4/4 // Share interface client/server public interface  Action { public void  doAction(); } // Remote action (on server) public class  ConcreteAction implements Action { public void  doAction() { //...  } } // Client proxy public class  ActionStub implements Action { public void  doAction() { // Send Tcp/Ip order for calling remote doAction   } }
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(&quot;SOPRA - Indirizzo di loopback&quot;); } }

More Related Content

What's hot (20)

PHP: strutture di controllo e funzioni
PHP: strutture di controllo e funzioniPHP: strutture di controllo e funzioni
PHP: strutture di controllo e funzioni
extrategy
Corso java base
Corso java baseCorso java base
Corso java base
Simone Gimelli
Baby Steps TripServiceKata
Baby Steps TripServiceKataBaby Steps TripServiceKata
Baby Steps TripServiceKata
Andrea Francia
PHP 7 - benvenuto al futuro
PHP 7 - benvenuto al futuroPHP 7 - benvenuto al futuro
PHP 7 - benvenuto al futuro
Christopher Pecoraro
Gcc & Make
Gcc & MakeGcc & Make
Gcc & Make
N3mes1s Uncategorized
Reachability properties &graphical user interface for cex module
Reachability properties &graphical user interface for cex module Reachability properties &graphical user interface for cex module
Reachability properties &graphical user interface for cex module
Giuseppe Sessa
Java lezione 5
Java lezione 5Java lezione 5
Java lezione 5
Sergio Ronchi
Linguaggi Di Programmazione Caso Di Studio
Linguaggi Di Programmazione   Caso Di StudioLinguaggi Di Programmazione   Caso Di Studio
Linguaggi Di Programmazione Caso Di Studio
Alartzero
06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili
Majong DevJfu
4 Strutture Condizionali
4   Strutture Condizionali4   Strutture Condizionali
4 Strutture Condizionali
guest60e9511
iContract
iContractiContract
iContract
guest891383
PHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLPHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQL
extrategy
Pe a1 perl-unit_testing
Pe a1 perl-unit_testingPe a1 perl-unit_testing
Pe a1 perl-unit_testing
Majong DevJfu
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
Majong DevJfu
Mocking Objects Practices
Mocking Objects PracticesMocking Objects Practices
Mocking Objects Practices
GrUSP
Design Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionDesign Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency Injection
Riccardo Cardin
Js intro
Js introJs intro
Js intro
Daniele Cruciani
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript Overview
Francesco Sciuti
Design pattern template method
Design pattern template methodDesign pattern template method
Design pattern template method
Nelson Firmani
Acadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS TodayAcadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS Today
Francesco Sciuti
PHP: strutture di controllo e funzioni
PHP: strutture di controllo e funzioniPHP: strutture di controllo e funzioni
PHP: strutture di controllo e funzioni
extrategy
Baby Steps TripServiceKata
Baby Steps TripServiceKataBaby Steps TripServiceKata
Baby Steps TripServiceKata
Andrea Francia
Reachability properties &graphical user interface for cex module
Reachability properties &graphical user interface for cex module Reachability properties &graphical user interface for cex module
Reachability properties &graphical user interface for cex module
Giuseppe Sessa
Linguaggi Di Programmazione Caso Di Studio
Linguaggi Di Programmazione   Caso Di StudioLinguaggi Di Programmazione   Caso Di Studio
Linguaggi Di Programmazione Caso Di Studio
Alartzero
06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili06 - Programmazione: Scope Variabili
06 - Programmazione: Scope Variabili
Majong DevJfu
4 Strutture Condizionali
4   Strutture Condizionali4   Strutture Condizionali
4 Strutture Condizionali
guest60e9511
PHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLPHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQL
extrategy
Pe a1 perl-unit_testing
Pe a1 perl-unit_testingPe a1 perl-unit_testing
Pe a1 perl-unit_testing
Majong DevJfu
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
Majong DevJfu
Mocking Objects Practices
Mocking Objects PracticesMocking Objects Practices
Mocking Objects Practices
GrUSP
Design Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency InjectionDesign Pattern Architetturali - Dependency Injection
Design Pattern Architetturali - Dependency Injection
Riccardo Cardin
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript Overview
Francesco Sciuti
Design pattern template method
Design pattern template methodDesign pattern template method
Design pattern template method
Nelson Firmani
Acadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS TodayAcadevmy - ES6 Modern JS Today
Acadevmy - ES6 Modern JS Today
Francesco Sciuti

Similar to Java codestyle & tipstricks (20)

Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
Federico Paparoni
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, java
Matteo Baccan
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
Franco Lombardo
Concurrency
ConcurrencyConcurrency
Concurrency
Ugo Landini
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascript
Riccardo Piccioni
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)
DotNetMarche
Java lezione 10
Java lezione 10Java lezione 10
Java lezione 10
Sergio Ronchi
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio c
ughetta
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5
JBug Italy
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano Ciccazzo
Java User Group Roma
Il testing con zend framework
Il testing con zend frameworkIl testing con zend framework
Il testing con zend framework
Zend by Rogue Wave Software
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
Valerio Radice
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)
DotNetMarche
Unit testing 101
Unit testing 101Unit testing 101
Unit testing 101
Daniel Londero
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
Marcello Missiroli
Java lezione 17
Java lezione 17Java lezione 17
Java lezione 17
Sergio Ronchi
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguida
Robert Casanova
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Library
jgiudici
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
Federico Paparoni
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, java
Matteo Baccan
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
Franco Lombardo
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascript
Riccardo Piccioni
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)
DotNetMarche
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio c
ughetta
April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5April 2010 - Seam unifies JEE5
April 2010 - Seam unifies JEE5
JBug Italy
Seam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano CiccazzoSeam unifies Java EE by Massimiliano Ciccazzo
Seam unifies Java EE by Massimiliano Ciccazzo
Java User Group Roma
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)
DotNetMarche
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguida
Robert Casanova
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Library
jgiudici

More from Domenico Briganti (8)

Software Testing e TDD
Software Testing e TDDSoftware Testing e TDD
Software Testing e TDD
Domenico Briganti
Xml annessi e connessi
Xml annessi e connessiXml annessi e connessi
Xml annessi e connessi
Domenico Briganti
Jersey Guice AOP
Jersey Guice AOPJersey Guice AOP
Jersey Guice AOP
Domenico Briganti
Xml Xslt
Xml  XsltXml  Xslt
Xml Xslt
Domenico Briganti

Java codestyle & tipstricks

  • 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. 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
  • 3. Attenzione!! Nelle slide che state per vedere ci sono degli errori inseriti di proposito, attenzione!!!
  • 4. 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.
  • 5. 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
  • 6. 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.
  • 7. Numeri int i = 012; System.out.println(i); 12 012 10 Nessuno di questi Risultato? C Con lo 0 davanti, il numero 竪 un ottale.
  • 8. 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 delloggetto su cui si applica un metodo 竪 implicito, evitare di ripeterlo nel metodo: line.getLength(); // NO: line.getLineLength();
  • 9. 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) { : }
  • 10. Java Code Style 5/10 Evitare i commenti nella stessa riga dellistruzione: int rotLength = Integer.parseInt(rotationLengthField.getText().trim()); // get rot len RotAscii cipher = new RotAscii(rotLength); // new cipher textArea.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 preparser prep.setEntityResolver(wr);// setto nel preparser l'entity resolver XMLGrammarPool p = new XMLGrammarPoolImpl();// creo la GrammarPool
  • 11. Operazione aritmetiche int a = 8; int b = 3; float f = a++/b--; System.out.println(f); 3.0 4.5 2.0 2.6 Risultato? C
  • 12. 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 luso di initXXX). Usare nome plurali per le collezioni. Usare variabili chiamate i, j, k ecc. nei cicli for.
  • 13. Java Code Style 7/10 Le classi che estendono da Exception devono essere chiamate XXXException. Limplementazione di default di uninterfaccia 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)
  • 14. Java Code Style 8/10 Le classi Singleton devono avere il metodo getInstance() per ritornare se stesse e avere il costruttore privato. LArray 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 leffettiva volont del programmatore: floatValue = (int) intValue; // NO: floatValue = intValue;
  • 15. Stringhe String s1 = aaa; s1.concat(bbb); System.out.println(s1); aaa aaabbb bbbaaa bbb Non compila Risultato? A
  • 16. 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 unistanza: Thread.sleep(1000); // NO: thread.sleep(1000);
  • 17. 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 loperazione pi湛 eseguita rispetto a quella del blocco else.
  • 18. 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/
  • 19. 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 /
  • 20. 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(&quot;addURL&quot;, parameters ); method.setAccessible(true); method.invoke(sysloader, new Object[] { u }); } catch (Throwable t) { t.printStackTrace(); throw new IOException(&quot;Error, could not add URL to system classloader&quot;); }
  • 21. Java Code Style DEMO Risulatato della verifica
  • 22. 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
  • 23. Ant con JUnit Cobertura e CheckStyle DEMO
  • 24. FindBug e PDM DEMO Link per il siteupdate di eclipse http:// findbugs.cs.umd.edu / eclipse http://pmd.sf.net/eclipse
  • 25. 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
  • 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. Eccezioni checked e unchecked se una procedura pu嘆 sollevare una eccezione checked deve elencarla nel suo header che fa parte anche della specifica altrimenti si verifica un errore a tempo di compilazione se una procedura pu嘆 sollevare una eccezione unchecked pu嘆 non elencarla nel suo header il suggerimento 竪 di elencarla sempre, per rendere completa la specifica se una procedura chiamata da p ritorna sollevando una eccezione se leccezione 竪 checked p deve gestire leccezione ( try and catch , vedi dopo) se leccezione (o uno dei suoi supertipi) 竪 elencata tra quelle sollevabili da p , pu嘆 essere propagata alla procedura che ha chiamato p se leccezione 竪 unchecked pu嘆 essere comunque gestita o propagata
  • 28. 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; } 9
  • 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. C竪 qualcosa che non va nel codice sotto? public synchronized void initGrammarParser() { try { CustomLogger.logmsg(CustomLogger.NOTICE, &quot;PresenceParser.initGrammarParser: Initializing XML Grammar Pool&quot;); 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, &quot;PresenceParser.initGrammarParser: Unable to initialize Grammar Parser&quot;); prep = null; } }
  • 31. Quando usare le eccezioni le eccezioni non sono necessariamente errori ma metodi per richiamare lattenzione 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 superiore IndexOutOfBoundsException segnala chiaramente un errore allinterno dellespressione 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 duso 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
  • 32. Gestione della memoria e Memory Leak Java Memory leak Allocated Reachable Live Handled by JVM
  • 33. 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
  • 34. Metodo equals public class Equals extends TestCase { public void testEquals() { MioValore val1 = new MioValore(&quot;1&quot;, 1); MioValore val2 = new MioValore(&quot;1&quot;, 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?
  • 35. Metodo Clone Shallow copy e deep copy Vector original = new Vector(); StringBuffer text = new StringBuffer(&quot;The quick brown fox&quot;); original.addElement(text); Vector clone = (Vector) original.clone(); Modifico la stringa text dentro original e aggiuno un intero al vettore text.append(&quot; jumps over the lazy dog.&quot;); original.addElement(new Integer(5)); Che succede? Che contenuto avr loggetto clone? Clone = {( The quick brown fox jumps over the lazy dog )}
  • 36. 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
  • 37. 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?
  • 38. Keyword synchronized Permette a due processi in esecuzione di comunicare tra di loro Garantisce che sono un thread per volta pu嘆 accedere al metodo/oggetto Garantisce che due o pi湛 processi partiranno/arresteranno allo stesso tempo Garantisce che due o pi湛 thread partiranno/arresteranno allo stesso tempo B
  • 39. 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(); } } Errore di Compilazione Runtime Error run() Nessun output Risultato? D
  • 40. 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); } } Il codice compila e ritorna a Il codice compila e ritorna b Non compila per un errore di metodo duplicato Il codice non compila per un errore reference, richiamato metodo non statico in un contesto statico C
  • 41. 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()); ClassCastEx.. Grunt Groar! Non compila Risultato? C
  • 42. 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
  • 43. Interfacce Public interface MyClass { void myMethod(); } La classe che implementa questa interfaccia Deve avere per forza il metodo myMethod come public Deve avere per forza il metodo myMethod come public o friendly Deve avere per forza il metodo myMethod che non solleva checked exception Deve avere per forza il metodo myMethod non sincronizzato
  • 44. Classi e variabili Final Una classe final pu嘆 ereditare da unaltra? Una classe dichiarata final pu嘆 avere metodi astratti? Una variabile final pu嘆 cambiare valore?
  • 45. Costruttori Quando si ottiene il costruttore di default? Quando si definisce una classe Quando la classe non ha costruttori Quando si definisce almeno un costruttore Mai B
  • 46. Ereditariet public static void main(String[] argv) { System. out .println(&quot;Main&quot;); classB c = new classB(); } class classB extends classC { public classB() {System. out .println(&quot;B&quot;);} } class classA { public classA() {System. out .println(&quot;A&quot;);} } class classC extends classA { public classC() {System. out .println(&quot;C&quot;);} } a) C,B,B,Main b) Main,A,C,B c) Main,A,B,C d) Main,A,B,A Risultato? B
  • 47. Switch public void metodo() { int k = 10; switch (k) { default: System. out .println(&quot;default&quot;); 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
  • 48. 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? Linea 5 b) Non 竪 possibile saperlo c) Linea 4 d) Fin quando il threan non termina C
  • 49. 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 + &quot; &quot; + i); } a) 15 0 20 b) 15 0 15 c) 20 0 20 d) 0 15 20 Risultato? A
  • 50. 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
  • 51. 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
  • 52. 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 allarchitettura del progetto ed a modellizzare meglio gli oggetti e le interazioni tra gli oggetti
  • 53. 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 Lobbiettivo dei design patterns e isolare i cambiamenti nel codice in modo da rendere facile levoluzione del progetto
  • 54. Classificazione 1/2 Creational: definisce la modalita di creazione degli oggetti Structural: definisce laggregazione di oggetti per formare structure piu vaste Behavioral: definisce gli oggetti per soddisfare particolari vincoli nel loro comportamento
  • 55. 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
  • 56. 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.
  • 58. 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 ) ; } } }
  • 59. 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 uninterfaccia 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.
  • 61. 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(); } }
  • 63. Proxy 1/4 Il pattern Proxy fornisce un sostituto di un oggetto per controllare laccesso ad esso. Un remote proxy puo nascondere il fatto che loggetto risiede in un altro server CORBA ed RMI (Remote Method Interface) sono implementati tramite il Pattern Proxy.
  • 65. 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(); } }
  • 66. Proxy 4/4 // Share interface client/server public interface Action { public void doAction(); } // Remote action (on server) public class ConcreteAction implements Action { public void doAction() { //... } } // Client proxy public class ActionStub implements Action { public void doAction() { // Send Tcp/Ip order for calling remote doAction } }
  • 67. 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(&quot;SOPRA - Indirizzo di loopback&quot;); } }

Editor's Notes

  • #33: 1- At the beginning of GC cycle, objects that are allocated but no longer reachable are reclaimed by the Garbage collector.