java 8: le nuove-interfacce di ezio sperduto
TRANSCRIPT
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 abstractand 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”