SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
Java	
  8	
  
le	
  nuove	
  interfacce	
  
Jug	
  Roma	
  
ezio	
  sperduto	
  
Java	
  8:	
  le	
  nuove	
  interfacce	
  -­‐	
  ezio	
  sperduto	
  
Jug	
  Roma	
  
novità	
  introdo6e	
  da	
  Java	
  8	
  
	
  
> 	
   	
  default	
  methods	
  
> 	
   	
  metodi	
  sta:ci	
  
	
  
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	
  
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	
  
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.
}
…
}
Jug	
  Roma	
  
Java	
  8:	
  le	
  nuove	
  interfacce	
  -­‐	
  ezio	
  sperduto	
  
language	
  designer	
   library	
  designer	
   sw	
  designer	
  
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	
  
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)	
  	
  
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	
  
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)	
  
	
  
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 abstract
and does not override abstract
method setRelativeSize(int,int)
in Ridimensionabile
	
  
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);
}
	
  
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	
  
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();
}
}
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*)	
  
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	
  
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”	
  
	
  
	
  
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	
  
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();
}
}
Java	
  8:	
  le	
  nuove	
  interfacce	
  -­‐	
  ezio	
  sperduto	
  
Jug	
  Roma	
  
	
  
	
  
Resolu5on	
  Rules:	
  Diamond	
  Problem	
  
A	
  
+	
  void	
  hello()	
  
B	
  
D	
  
C	
  
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?	
  
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.	
  
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?	
  
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!	
  
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	
  
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à)	
  
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)	
  
Jug	
  Roma	
  
Riferimen:	
  
Oracle	
  
The	
  Java	
  Tutorials	
  
Java	
  8	
  in	
  AcQon	
  	
  
Urma,	
  Fusco,	
  MycroO	
  
(Manning)	
  
Java	
  8:	
  le	
  nuove	
  interfacce	
  -­‐	
  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”	
  

Mais conteúdo relacionado

Destaque

Iced tea, la macchina virtuale Java libera
Iced tea, la macchina virtuale Java liberaIced tea, la macchina virtuale Java libera
Iced tea, la macchina virtuale Java liberaVitalij Zadneprovskij
 
Protocolli di comunicazione tra moduli e SOA
Protocolli di comunicazione tra moduli e SOAProtocolli di comunicazione tra moduli e SOA
Protocolli di comunicazione tra moduli e SOAVitalij Zadneprovskij
 
GlusterFs: a scalable file system for today's and tomorrow's big data
GlusterFs: a scalable file system for today's and tomorrow's big dataGlusterFs: a scalable file system for today's and tomorrow's big data
GlusterFs: a scalable file system for today's and tomorrow's big dataRoberto Franchini
 
Complessità e ordinamento di Ezio Sperduto
Complessità e ordinamento di Ezio SperdutoComplessità e ordinamento di Ezio Sperduto
Complessità e ordinamento di Ezio SperdutoVitalij Zadneprovskij
 

Destaque (10)

Metodi asincroni in spring
Metodi asincroni in springMetodi asincroni in spring
Metodi asincroni in spring
 
Iced tea, la macchina virtuale Java libera
Iced tea, la macchina virtuale Java liberaIced tea, la macchina virtuale Java libera
Iced tea, la macchina virtuale Java libera
 
Appunti di teoria dell informazione
Appunti di teoria dell informazioneAppunti di teoria dell informazione
Appunti di teoria dell informazione
 
OOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni LambdaOOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni Lambda
 
Java lezione 8
Java lezione 8Java lezione 8
Java lezione 8
 
Protocolli di comunicazione tra moduli e SOA
Protocolli di comunicazione tra moduli e SOAProtocolli di comunicazione tra moduli e SOA
Protocolli di comunicazione tra moduli e SOA
 
GlusterFs: a scalable file system for today's and tomorrow's big data
GlusterFs: a scalable file system for today's and tomorrow's big dataGlusterFs: a scalable file system for today's and tomorrow's big data
GlusterFs: a scalable file system for today's and tomorrow's big data
 
Continous integration e jenkins
Continous integration e jenkinsContinous integration e jenkins
Continous integration e jenkins
 
Complessità e ordinamento di Ezio Sperduto
Complessità e ordinamento di Ezio SperdutoComplessità e ordinamento di Ezio Sperduto
Complessità e ordinamento di Ezio Sperduto
 
8. Architetture web
8. Architetture web8. Architetture web
8. Architetture web
 

Semelhante a Java 8: le nuove-interfacce di Ezio Sperduto

Semelhante a Java 8: le nuove-interfacce di Ezio Sperduto (20)

Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
Functional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni LambdaFunctional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni Lambda
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 
Corso Object Oriented Analysis and Design
Corso Object Oriented Analysis and DesignCorso Object Oriented Analysis and Design
Corso Object Oriented Analysis and Design
 
Corso Java
Corso JavaCorso Java
Corso Java
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven Development
 
Mini Corso Java - Parte 3
Mini Corso Java - Parte 3Mini Corso Java - Parte 3
Mini Corso Java - Parte 3
 
Vb.Net
Vb.NetVb.Net
Vb.Net
 
Testing in javascript
Testing in javascriptTesting in javascript
Testing in javascript
 
javaday 2006 - Tiger
javaday 2006 - Tigerjavaday 2006 - Tiger
javaday 2006 - Tiger
 
Pycon
PyconPycon
Pycon
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
 
Sviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsSviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con Grails
 
Corso java base
Corso java baseCorso java base
Corso java base
 
Groovy & Grails
Groovy & GrailsGroovy & Grails
Groovy & Grails
 
Java SE 5. Capitolo 01: Base
 Java SE 5. Capitolo 01: Base Java SE 5. Capitolo 01: Base
Java SE 5. Capitolo 01: Base
 
iContract
iContractiContract
iContract
 

Java 8: le nuove-interfacce di Ezio Sperduto

  • 1. Java  8   le  nuove  interfacce   Jug  Roma   ezio  sperduto  
  • 2. Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto   Jug  Roma   novità  introdo6e  da  Java  8     >    default  methods   >    metodi  sta:ci    
  • 3. 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  
  • 4. 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  
  • 5. 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. } … }
  • 6. Jug  Roma   Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto   language  designer   library  designer   sw  designer  
  • 7. 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  
  • 8. 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)    
  • 9. 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  
  • 10. 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)    
  • 11. 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 abstract and does not override abstract method setRelativeSize(int,int) in Ridimensionabile  
  • 12. 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); }  
  • 13. 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  
  • 14. 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(); } }
  • 15. 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*)  
  • 16. 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  
  • 17. 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”      
  • 18. 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  
  • 19. 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(); } }
  • 20. Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto   Jug  Roma       Resolu5on  Rules:  Diamond  Problem   A   +  void  hello()   B   D   C  
  • 21. 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?  
  • 22. 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.  
  • 23. 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?  
  • 24. 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!  
  • 25. 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  
  • 26. 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à)  
  • 27. 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)  
  • 28. Jug  Roma   Riferimen:   Oracle   The  Java  Tutorials   Java  8  in  AcQon     Urma,  Fusco,  MycroO   (Manning)   Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto  
  • 29. Java  8:  le  nuove  interfacce  -­‐  ezio  sperduto   Jug  Roma   Grazie  per  l’a6enzione!                          Domande?   Con:nua  con  .  .  .   “Java  8:  λ-­‐expression  e  programmazione  funzionale”