java 8: le nuove-interfacce di ezio sperduto

29
Java 8 le nuove interfacce Jug Roma ezio sperduto

Upload: vitalij-zadneprovskij

Post on 13-Aug-2015

248 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8  le  nuove  interfacce  

Jug  Roma  

ezio  sperduto  

Page 2: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

novità  introdo6e  da  Java  8    >    default  methods  

>    metodi  sta:ci    

Page 3: Java 8: le nuove-interfacce di Ezio Sperduto

Jug  Roma  

le  interfacce  pre  –  Java  8    

>  contra6o  tra  programmatori                    (chi  crea  una  classe  e  chi  la  usa)    

>  :po  astra4o    

>  polimorfismo  di  :po    (ereditarietà  mul:pla,  classica  domanda  da  colloquio)  

 

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Page 4: Java 8: le nuove-interfacce di Ezio Sperduto

Jug  Roma  

le  interfacce  pre  –  Java  8    

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

permesso   vietato  

proto:pi  metodi   implementazioni  

costan:   variabili  

solo  membri  pubblici   costru6ori  

Page 5: Java 8: le nuove-interfacce di Ezio Sperduto

Jug  Roma  

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

default  methods:  implementazione  di  default  (comportamento),  presente  già  nell’interfaccia  

interface Collection{

default void sort(Comparator c){// ordina etc.

}

…}

Page 6: Java 8: le nuove-interfacce di Ezio Sperduto

Jug  Roma  

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

language  designer   library  designer   sw  designer  

Page 7: Java 8: le nuove-interfacce di Ezio Sperduto

Jug  Roma  

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

interfaccia  di  libreria   implementazione  programmatore  

implementa  m.astra6o  1  

m.astra6o  2  

m.concreto  1  

m.concreto  2  Ver.1  

Page 8: Java 8: le nuove-interfacce di Ezio Sperduto

Jug  Roma  

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

interfaccia  di  libreria   implementazione  programmatore  

implementa  m.astra6o  1  

m.astra6o  2  

m.concreto  1  

m.concreto  2  Ver.1  

interfaccia  di  libreria   implementazione  programmatore  

implementa  m.astra6o  1  

m.astra6o  2  

m.concreto  1  

m.concreto  2  Ver.2  

m.astra6o  NEW   ?????????????  

Il  programmatore  deve  modificare  la  sua  implementazione  per  poter  usare  la  nuova  libreria  (anche  senza  aggiungere  valore  al  suo  so8ware)    

Page 9: Java 8: le nuove-interfacce di Ezio Sperduto

Jug  Roma  

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

interfaccia  di  libreria   implementazione  programmatore  

implementa  m.astra6o  1  

m.astra6o  2  

m.concreto  1  

m.concreto  2  Ver.1  

interfaccia  di  libreria   implementazione  programmatore  

implementa  m.astra6o  1  

m.astra6o  2  

m.concreto  1  

m.concreto  2  Ver.2  

default  method  

m.default  NEW  

Il  programmatore  beneficia  dell’implementazione  di  default  senza  alcuna  modifica  

m.default  NEW  

Page 10: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

 Kinds  Of  Compa5bility    ü  source  compa:bility        

 (compilazione  priva  di  errori)    

ü  binary  compa:bility          (linking  privo  di  errori)  

 

ü  behavioral  compa:bility          (escecuzione  priva  di  errori  logici)  

 

Page 11: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

 Kinds  Of  Compa5bility    ü  source  compa:bility    NO    

 (compilazione  priva  di  errori)    

ü  binary  compa:bility    OK      (linking  privo  di  errori)  

 

ü  behavioral  compa:bility      ?    (escecuzione  priva  di  errori  logici)  

 

Exception in thread "main" java.lang.AbstractMethodError

error: Ellipse is not abstractand does not override abstract method setRelativeSize(int,int) in Ridimensionabile

 

Page 12: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

“Default methods are a new feature added in Java 8 to help evolve APIs in a compatible way”  

default void setRelativeSize(int lFatt, int hFatt){

int newLarghezza = getLarghezza() / lFatt;int newAltezza = getAltezza() / hFatt;

setAbsoluteSize(newLarghezza,newAltezza); }  

Page 13: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

interfaces  VS  abstract  classes  

 sono  diventate  la  stessa  cosa?      SI  e  NI!  

1. ereditarietà  (singola/mul:pla)  

2. la  classe  astra6a  definisce  lo  STATO      -­‐  campi  definiscono  la  situazione  iniziale    -­‐  metodi  d’istanza  definiscono  comportamento  su  stato*    -­‐  costru4ori  definiscono  l’inizializzazione  dell’istanza**  

*  dunque  i  default  method  non  sono  veri  e  propri  metodi  d’istanza?    **  costru6ori  si,  istanziazione  no  

Page 14: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules  Cosa  stampa?  interface A{

default void hello(){System.out.println(“sono A”);

}}

interface B{default void hello(){

System.out.println(“sono B”);}

}

class C implements A,B{public static void main(String...args){

new C().hello();}

}

Page 15: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules  

1.   la  classe  vince  sempre  un  metodo  dichiarato  in  classe/superclasse  ha  priorità  su  qualunque  default  method    

2.   la  sub-­‐interfaccia  vince  sulla  super-­‐interfaccia  ha  priorità  il  default  method  più  specifico    (se  il  default  method  è  definito  in  A  e  B  con  la  stessa  firma,  e  B  estende  A,    il  metodo  scelto  sarà  sempre  quello  di  B)    

3.   negli  altri  casi:  errore  del  compilatore!    se  non  ci  troviamo  in  1.  o  2.  abbiamo  un  ambiguità    (possiamo  evitarla  o  risolverla  manualmente*)  

Page 16: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules  

// stesse interfacce A e B di prima

public class D implements A{ }

public class C extends D implements A,B{public static void main(String...args){

new C().hello();}

}

Cosa  stampa?  

A  +  void  hello()  

B  +  void  hello()  

D  

C  

Page 17: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules  

Cosa  stampa?    La  regola  1.  indica  priorità  al  metodo  della  classe.  Ma  non  ci  sono  metodi  “dichiara:”  nella  classe  (non  c’è  overriding)    La  regola  2.  indica  che  ha  priorità  il  metodo  “più  specifico”    Dunque  stamperà  “sono  B”      

Page 18: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules  

// stesse interfacce A e B di prima

public class C implements A,B{

public static void main(String...args){new C().hello();

}

}

Cosa  stampa?  

A  +  void  hello()  

B  +  void  hello()  

C  

Page 19: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules  Cosa  stampa?    Si  segue  la  regola  3.  (errore),  come  scavalcarlo?    Risposta:  override  nella  classe,  esplicitando  il  default  method  preferito    

// stesse interfacce A e B di prima

public class C implements A,B{. . .void hello(){

B.super.hello();}

}

Page 20: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules:  Diamond  Problem  

A  +  void  hello()  

B  

D  

C  

Page 21: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules:  Diamond  Problem  interface A{

default void hello(){System.out.println("sono A");

}}

interface B extends A{}

interface C extends A{}

class D implements B,C{public static void main(String...a){

new D().hello();}

Cosa  stampa?  

Page 22: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules:  Diamond  Problem  interface A{

default void hello(){System.out.println("sono A");

}}

interface B extends A{}

interface C extends A{}

class D implements B,C{public static void main(String...a){

new D().hello();}

Cosa  stampa?  

Unico  metodo  a  disposizione  (default).    Non  ci  sono  ambiguità:  stampa  “sono  A”.    In  C++:  caso  più  complesso,  ereditarietà  mul:pla.  Doppia  copia  del  metodo  e  disambiguazione.  

Page 23: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules:  Diamond  Problem  (v.2)  interface A{

default void hello(){System.out.println("sono A");

}}

interface B extends A{void hello();

}

interface C extends A{}

class D implements B,C{public static void main(String...a){

new D().hello();}

Cosa  stampa?  

Page 24: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Resolu5on  Rules:  Diamond  Problem  (v.2)  interface A{

default void hello(){System.out.println("sono A");

}}

interface B extends A{void hello();

}

interface C extends A{}

class D implements B,C{public static void main(String...a){

new D().hello();}

Cosa  stampa?  

Compe:zione  tra  metodo  default  e  metodo  astra6o.      Regola  2.  il  metodo  più  specifico  ha  priorità.  Il  metodo  astra6o  è  un  override  del  default.    Dunque  errore:  il  compilatore  chiederà  ridefinizione  in  D!  

Page 25: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Default  Method:  usage  paDerns  

>  opQonal  method    forzatura  nell’implementazione  di  metodo,  boilerplate  code    (lancio  un  eccezione  su  metodo  non  implementato)  

 

>  ereditarietà  mulQpla  di  comportamento    ereditando  da  più  interfacce,  eredi:amo  più  default  method    -­‐  proge6azione  di  interfacce  minimiali    -­‐  composizione  di  interfacce  ortogonali  

Page 26: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Nuove  Interfacce:  metodi  sta5ci  

Pre  Java  8:    -­‐  creare  interfaccia  e  classe  accompagnatrice    (interfaccia  Collection  classe  Collections)  

Con  Java  8:    -­‐  i  metodi  di  u:lità  comune  sono  incorpora:      nell’interfaccia  stessa,  si  sviluppa  solo  1  :po    (le  classi  precedentemente  sviluppate  sono  mantenute    per  retrocompa5bilità)  

Page 27: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

   

Esempi  reali  interface Collection<E>{

. . .default void sort(Comparator<? super E> c){Collections.sort(this, c); }

}

interface Comparator<T>{. . .static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {

. . .}

}

List<Integer> numbers=Arrays.asList(0,1,1,2,3,5,8,13);numbers.sort(Comparator.naturalOrder());

maggiore  riflessività!  OOP  

(Comparator  esempio  emblema5co)  

Page 28: Java 8: le nuove-interfacce di Ezio Sperduto

Jug  Roma  

Riferimen:  Oracle  The  Java  Tutorials  

Java  8  in  AcQon    Urma,  Fusco,  MycroO  (Manning)  

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Page 29: Java 8: le nuove-interfacce di Ezio Sperduto

Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  

Jug  Roma  

Grazie  per  l’a6enzione!                          Domande?  

Con:nua  con  .  .  .  “Java  8:  λ-­‐expression  e  programmazione  funzionale”