Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Effective Java Blå gruppe. Item 18: Interfaces frem for abstrakte klasser Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt.

Lignende præsentationer


Præsentationer af emnet: "Effective Java Blå gruppe. Item 18: Interfaces frem for abstrakte klasser Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt."— Præsentationens transcript:

1 Effective Java Blå gruppe

2 Item 18: Interfaces frem for abstrakte klasser Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt omskrives til at implementere et interface Klasser kan kun nedarve fra en abstrakt klasse Nemt at tilføje ekstra features, mixins Gode til ikke hierakiske strukturer Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt omskrives til at implementere et interface Klasser kan kun nedarve fra en abstrakt klasse Nemt at tilføje ekstra features, mixins Gode til ikke hierakiske strukturer

3 EksempelEksempel public interface Singer { AudioClip sing(Song s);} public interface Songwriter { Song compose(boolean hit);} public interface SingerSongwriter extends Singer, Songwriter { AudioClip strum(); void actSensitive();} public interface Singer { AudioClip sing(Song s);} public interface Songwriter { Song compose(boolean hit);} public interface SingerSongwriter extends Singer, Songwriter { AudioClip strum(); void actSensitive();}

4 Item 8 equals() metoden Fra klassen Object ”designed to be overridden” Fra klassen Object ”designed to be overridden”

5 Hvornår?Hvornår? Når klasser logisk set er ens. og equals ikke allerede er hensigtsmæssigt overskrevet i en superklasse. Eks. Integer klassen overskriver equals(), da man er interesseret i om to tal logisk set er ens, og ikke om de refererer til det samme objekt. Når klasser logisk set er ens. og equals ikke allerede er hensigtsmæssigt overskrevet i en superklasse. Eks. Integer klassen overskriver equals(), da man er interesseret i om to tal logisk set er ens, og ikke om de refererer til det samme objekt.

6 General Contracts Følgende regler skal overholdes når man overrider equals(). Sikre at klasser som gør brug af equals() virker rigtigt(HashMap, HasSet…) Følgende regler skal overholdes når man overrider equals(). Sikre at klasser som gør brug af equals() virker rigtigt(HashMap, HasSet…)

7 General Contracts For værdier som ikke er null: Reflexive: x.equals(x) Symmetric: y.equals(x) Iff x.equals(y) Transitive: hvis x.equals(y) og y.equals(z) så skal også x.equals(z) Consistent: x.equals(y) konsistent returværdi ved gentagne kald. og sidst, x.equals(null) skal return false For værdier som ikke er null: Reflexive: x.equals(x) Symmetric: y.equals(x) Iff x.equals(y) Transitive: hvis x.equals(y) og y.equals(z) så skal også x.equals(z) Consistent: x.equals(y) konsistent returværdi ved gentagne kald. og sidst, x.equals(null) skal return false

8 ProblemProblem Man kan ikke udvide(extend) en instansierbar klasse og tilføje komponenter uden at bryde kontrakten med equals. (se evt. eks. S 40.) Workaround Brug composition i stedet for inheritance Problemet forekommer ikke med en abstract superklasse Man kan ikke udvide(extend) en instansierbar klasse og tilføje komponenter uden at bryde kontrakten med equals. (se evt. eks. S 40.) Workaround Brug composition i stedet for inheritance Problemet forekommer ikke med en abstract superklasse

9 Opskrift på en god equals metode Brug == operatoren når du tjekker om et argument er en reference til this objekt (performance). Brug instanceof til at tjekke om argumentet er af den korrekte type (som regel den klasse man står i). Cast derefter argumentet til den korrekte type. For hvert (betydelige) felt i klassen, tjek at det stemmer overens med det tilsvarende felt i argumentet. Husk: Float.compare, Double.compare Brug == operatoren når du tjekker om et argument er en reference til this objekt (performance). Brug instanceof til at tjekke om argumentet er af den korrekte type (som regel den klasse man står i). Cast derefter argumentet til den korrekte type. For hvert (betydelige) felt i klassen, tjek at det stemmer overens med det tilsvarende felt i argumentet. Husk: Float.compare, Double.compare

10 Opskrift på en god equals metode Er metoden symmetric? Transitive? Consisten? (reflexivity og non-null klarer som regel sig selv) Override HashCode når du overrider equals Keep it simple – nemmere at overholde kontrakt når man kun tester felter. Er metoden symmetric? Transitive? Consisten? (reflexivity og non-null klarer som regel sig selv) Override HashCode når du overrider equals Keep it simple – nemmere at overholde kontrakt når man kun tester felter.

11 EksempelEksempel @Override public boolean equals(Object o){ if(!(o instanceof MyType)) return false; MyType mt = (MyType)o; … compare types … } @Override public boolean equals(Object o){ if(!(o instanceof MyType)) return false; MyType mt = (MyType)o; … compare types … }

12 Item 28: Use bounded wildcards to increase API flexibility – Unbounded og Bounded Wildcards – – Wildcards i Generiske Metoder – – Explicit Type Parameter – – Wildcard Capture – – Unbounded og Bounded Wildcards – – Wildcards i Generiske Metoder – – Explicit Type Parameter – – Wildcard Capture –

13 MyList Klassen import java.util.*; public class MyList implements List { private ArrayList list; public MyList() { list = new ArrayList (); } … } import java.util.*; public class MyList implements List { private ArrayList list; public MyList() { list = new ArrayList (); } … } Object Vehicle CarBike Integer Forskellige type parametre

14 print() Metoden public static void printList(MyList l) { for (Object o : l) system.out.println(l); } public static void printList(MyList l) { for (Object o : l) system.out.println(l); } Object Vehicle CarBike Integer Type parameteren er gemt i objektet! (Generisk metode kan bruges men skal defineres udefra) ?

15 Unbounded Wildcard Unbounded Wildcard public static void printList(MyList l) { for (Object o : l) system.out.println(l); } public static void printList(MyList l) { for (Object o : l) system.out.println(l); } Object Vehicle CarBike Integer

16 addAll() Metoden public boolean addAll(Collection c) { boolean check = false; for(E element : c) check = list.add(element); return check; } public boolean addAll(Collection c) { boolean check = false; for(E element : c) check = list.add(element); return check; } Object Vehicle CarBike Integer

17 public void testAddAll() { MyList carlist; MyList vehiclelist; carlist = new MyList (); vehiclelist = new MyList (); vehiclelist.addAll(carlist); } public void testAddAll() { MyList carlist; MyList vehiclelist; carlist = new MyList (); vehiclelist = new MyList (); vehiclelist.addAll(carlist); } Object Vehicle CarBike Integer Parameter typen i listen er invariant! Test af addAll()

18 addAll() Metoden public boolean addAll(Collection c) { boolean check = false; for(E element : c) check = list.add(element); return check; } public boolean addAll(Collection c) { boolean check = false; for(E element : c) check = list.add(element); return check; } public boolean addAll(Collection c) { boolean check = false; for(Object o : c) check = list.add(o); return check; } Object Vehicle CarBike Integer Parameter typen i listen måske ikke Object!

19 Bounded Wildcard Bounded Wildcard public boolean addAll( Collection c) { boolean check = false; for(E element : c) check = list.add(element); return check; } Object Vehicle CarBike Integer Husk: Bounded wildcard er subtype af sig selv!

20 revMoveAll() Metoden public void revMoveAll(Collection c) { while (!list.isEmpty()) c.add(list.remove(list.size()- 1)); } public void revMoveAll(Collection c) { while (!list.isEmpty()) c.add(list.remove(list.size()- 1)); } Object Vehicle CarBike Integer

21 Test af revMoveAll() public void testRevMoveAll() { MyList bikelist; MyList vehiclelist; bikelist = new MyList (); vehiclelist = new MyList (); vehiclelist.revMoveAll(carlist); } public void testRevMoveAll() { MyList bikelist; MyList vehiclelist; bikelist = new MyList (); vehiclelist = new MyList (); vehiclelist.revMoveAll(carlist); } Object Vehicle CarBike Integer Parameter typen i listen er invariant!

22 Bounded Wildcard Bounded Wildcard public void revMoveAll( Collection c) { while (!list.isEmpty()) c.add(list.remove(list.size()-1)); } Object Vehicle CarBike Integer Husk: Bounded wildcard er supertype af sig selv!

23 P.E.C.S.P.E.C.S. Collection P roducer : E xtends C onsumer : S uper Collection MyList

24 Wildcards i Generisk Metode public static MyList union( MyList l1, MyList l2 { MyList l = new Mylist (); l.addAll(l1); l.addAll(l2); return l; } public static MyList union( MyList l1, MyList l2 { MyList l = new Mylist (); l.addAll(l1); l.addAll(l2); return l; } Object Vehicle CarBike Integer Husk: Undgå wildcards i returværdier!

25 Explicit Type Parameter public void testUnion() { MyList bikes; MyList cars; MyList vehiclelist; bikelist = new MyList (); carlist = new MyList (); vehiclelist = MyList.union(bikes,cars); } public void testUnion() { MyList bikes; MyList cars; MyList vehiclelist; bikelist = new MyList (); carlist = new MyList (); vehiclelist = MyList.union(bikes,cars); } Object Vehicle CarBike Integer

26 swap() Metoden public static void swap(MyList list, int i, int j) { list.set(i, list.set(j, list.get(i))); } Object Vehicle CarBike Integer ? Man kan kun bringe en wildcard tilbage hvis elementet er null!

27 Wildcard Capture public static void swap(MyList list, int i, int j) { swapHelper(list,i j); } private static void swapHelper( MyList list, int i, int j) { list.set(i, list.set(j, list.get(i))); } Object Vehicle CarBike Integer ?

28 Item 38, 48 & 58 38: Tjek parameteren, lav exceptionkal som ved < 0 48: Undgå float og double til præcise svar 58: Check og runtime exceptions 38: Tjek parameteren, lav exceptionkal som ved < 0 48: Undgå float og double til præcise svar 58: Check og runtime exceptions


Download ppt "Effective Java Blå gruppe. Item 18: Interfaces frem for abstrakte klasser Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt."

Lignende præsentationer


Annoncer fra Google