50 minuti per svelare la tigre, il cavallo e sapere che esiste il delfino.
La nuova versione di Java implementa caratteristiche che da tempo erano attese
nello standard del linguaggio: Metadata, Generic Types, AutoBoxing e
Unboxing dei tipi primitivi, Static import, gestione dinamica dei Loop e delle
Enumeration.
Per Java 6: gestione di SystemTray e motori di scripting.
Vediamo di cosa si tratta e di come poter utilizzare queste nuove feature all'interno dei nostri programmi
Il Corso Programmazione Java Base di K-Tech (http://www.k-tech.it) ha come obiettivo quello di far comprendere le tecniche di programmazione orientata agli oggetti, cio竪 di modellare e pensare a oggetti, di trasmettere i concetti base del linguaggio e le basi per sviluppare piccole applicazioni in modo autonomo.
Il corso Programmazione Java Base 竪 composto da dodici moduli:
1. Introduzione
2. Ciclo di sviluppo
3. Sintassi Elementare
4. Principi OOP
5. Classi e Oggetti
6. Concetti Object Oriented
7. Collections
8. Eccezioni
9. Input Output
10. Serialization
11. Unit Testing
12. Threads
Leggi il programma completo: http://www.k-tech.it/formazione/catalogo/programmazione_java_base
This presentation talks about behavioural design patterns. In software engineering, behavioral design patterns are design patterns that identify common communication patterns between objects and realize these patterns. By doing so, these patterns increase flexibility in carrying out this communication. In particular in the slides are described the following patterns:
- Command
- Iterator
- Observer
- Strategy
- Template Method
Design patterns are presented using examples in Java, Scala and Javascript.
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
際際滷 quinta lezione al linguaggio Java 8 in preparazione alla certificazione OCA 1Z0-808.
Argomenti:
Invocazione virtuale dei metodi
Eccezioni, gestione e creazione
Catturare e rilanciare eccezioni
NullPointer
Operazioni lambda, Predicate e principali operazioni
Stream
Lezione del 05-12-2017 tenuta da Valerio Radice presso Nextre Engeneering
https://www.nextre.it/corso/corso-java-oca/
I test unitari sono sempre pi湛 utilizzati per verificare la correttezza del codice che scriviamo.
Ci si trova per嘆 a volte di fronte a codice scritto in maniera poco "disaccoppiata". Questo pu嘆 impedirci di sostituire a runtime dei Dependent-on Object con dei Mock Object o degli Stub. Nel talk descriver嘆 un plugin scritto per symfony (ma utilizzabile anche in altri ambiti) che permette di sostituire delle classi a runtime ridefinendole e configurandole all'interno dei test, creando un ambiente che isola il codice da verificare.
Il talk preveder degli esempi pratici di utilizzo dello strumento descritto.
This presentation talks about dependecy injection, an architectural design pattern that aims to help developer to resolve dependencies between objects. Starting by describing general problem of dependecy resolution, the presentation continues presenting Inversion of Control (IoC) pattern, constructor injection and setting injection. As examples, some frameworks and libraries are reported, such as:
- Google Guice
- Spring framework
- AngularJS
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
TypeScript ha cambiato il modo di scrivere JavaScript ed in questo talk andiamo a scoprirne le principali caratteristiche per scrivere "JavaScript che non si rompe!"
N.B. Le slides sono aggiornate sino a TS 3.
ES6 竪 stata una rivoluzione nel mondo JavaScript ed ha portato il linguaggio ad uno step successivo.
In questo talk si affrontano gli aspetti che hanno resto fondamentale questo nuovo standard.
I test unitari sono sempre pi湛 utilizzati per verificare la correttezza del codice che scriviamo.
Ci si trova per嘆 a volte di fronte a codice scritto in maniera poco "disaccoppiata". Questo pu嘆 impedirci di sostituire a runtime dei Dependent-on Object con dei Mock Object o degli Stub. Nel talk descriver嘆 un plugin scritto per symfony (ma utilizzabile anche in altri ambiti) che permette di sostituire delle classi a runtime ridefinendole e configurandole all'interno dei test, creando un ambiente che isola il codice da verificare.
Il talk preveder degli esempi pratici di utilizzo dello strumento descritto.
This presentation talks about dependecy injection, an architectural design pattern that aims to help developer to resolve dependencies between objects. Starting by describing general problem of dependecy resolution, the presentation continues presenting Inversion of Control (IoC) pattern, constructor injection and setting injection. As examples, some frameworks and libraries are reported, such as:
- Google Guice
- Spring framework
- AngularJS
The presentation is took from the Software Engineering course I run in the bachelor-level informatics curriculum at the University of Padova.
TypeScript ha cambiato il modo di scrivere JavaScript ed in questo talk andiamo a scoprirne le principali caratteristiche per scrivere "JavaScript che non si rompe!"
N.B. Le slides sono aggiornate sino a TS 3.
ES6 竪 stata una rivoluzione nel mondo JavaScript ed ha portato il linguaggio ad uno step successivo.
In questo talk si affrontano gli aspetti che hanno resto fondamentale questo nuovo standard.
Abstract:
* Introduzione a Seam ;
* Ciclo di vita di Seam;
* Component and context;
* Absolute Inversion of Control;
* Rapid Seam development (con esempio di start-up su eclipse o se si preferisce a linea di comando);
* Differenze sostanziali con la versione 3.0 / Ajax and Javascript remoting
Il testing delle applicazioni MVC Zend Framework 竪 spesso visto come una sorta di stregoneria, ma tutto sommato non lo 竪. In questo seminario web vedremo cosa e come testare, i pattern pi湛 comuni per il testing e le possibili difficolt che si possono incontrare. Verranno trattati inoltre alcuni elementi di base su PHPUnit in modo da fornire concetti fondamentali per loperativit anche a chi non 竪 esperto di testing.
際際滷 introduttive al linguaggio Java 8 in preparazione alla certificazione OCA 1Z0-808.
Lezione del 12-10-2017 tenuta da Valerio Radice presso Nextre Engeneering
https://www.nextre.it/corso/corso-java-oca/
Potenza e controllo con le Parallel Libraries (Raffaele Rialdi)DotNetMarche
油
Abbiamo sentito ripetere pi湛 volte che la crescita di potenza sar in funzione del numero di Core della CPU e non pi湛 in termini di GHz. Questo 竪 gi avvenuto e la nuova generazione di PC approda a 8 core mentre i cellulari vedranno presto i 2 e poi i 4 core.
I dati di fatto sono che non 竪 possibile eseguire magicamente la parallelizzazione dei nostri applicativi, tantomeno 竪 pensabile di utilizzare strumenti di basso livello come i thread.
Nel corso della sessione vedremo quanto potenti siano le nuove Parallel Libraries e come trarne vantaggio senza doverci preoccupare del numero di core presenti sul PC.
Introduzione al linguaggio Java per chi ha esperienza di C++. Non si parla di OOP, solo di linguaggio.
Codice sorgente dell'esercizio finale qui: https://pastebin.com/R4yZGQcy
LeXtensible Markup Language, fin dalla sua nascita, ha avuto un gran consenso da parte di tutti gli attori che operano nel mondo informatico, diventando di fatto la base di molte applicazioni, in particolar modo di quelle che fondano la loro attivit sullo scambio di informazioni, per la sua semplicit ed interoperabilit.
Poche chiacchiere e tanto codice per cercare rendere la nostra vita di
sviluppatori pi湛 divertente.
Parleremo di JAX-RS, le annotazioni, l'MVC che mette a disposizione e
l'integrazione di Jersey con Guice.
Useremo AOP per gestire log, transazioni e con l'aiuto di Infinispan
limiteremo le chamate concorrenti sul nostro cluster.
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();
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("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"); }
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
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, "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; } }
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("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?
35. 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 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("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
47. 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
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 + " " + 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
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("SOPRA - Indirizzo di loopback"); } }
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.