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

Slides:



Advertisements
Lignende præsentationer
Velkommen til Softwarekonstruktion
Advertisements

07 – Kort om OO Introduktion.
1 Frameworks. 2 Plan Frameworks • Kollektioner • Input/output Nyt designmønster: Decorator.
T1 – OPGAVE 14.2 LINETT & SABRINA Klasse Varer namespace Opgave_14._2 { class Varer { private string vare; private string farve; private double.
Array og ArrayList Et slideshow. Som er sødt.. Hvordan virker ArrayList?  ArrayList NAVN = new ArrayList ();  NAVN.add(”Værdi”);  NAVN.add(index, ”værdi”)
KONCEPT Klasser og objekter En klasse beskriver et World ArrayList
Item gennemgang  Item: 01 – Static factory methods  Item: 09 – Override hashCode  Item: 17 – Design & document inheritence  Item: 25 – Lists over arrays.
Array vs. ArrayList. Arrays Et array er en struktureret metode til at gemme flere værdier af den samme datatype. Data’en i et array ligger op ad hinanden.
Selve objektet versus referencen til objektet Nedarvning
Objektorienteret programmering
09 – Arv og polymorfi i java
Hvordan man skriver koden.
Structs Structs allokeres på stakken Memory-allokering sker ved oprettelse af variabel og ikke ved new Der kan defineres metoder incl. Constructor. Eksempel.
Begreber og Redskaber 5. Collections i Java 1.2 Framework: samling af datastrukturer og algoritmer som generelt værktøj. En ramme til at arbejde med søgning.
Forelæsning 3.1 Collections Javas for-each løkke
Indledende Programmering Uge 8 - Efterår 2006 Mere om abstraktioner Susanne Lindros.
Opsamling Loops Klassedesign Immutable Lister shallowCopy() Projekt 2 FEN KbP/seminar3: Opsamling.
Interfaces – brug. Overblik Tidligere: –Interfaces Comparable gør det muligt at bruge Collections metoderne –min, max, sort, … –Algoritmemønstre Find.
To måder at overføre objekt- referencer mellem processer (1) Via naming service - interface RMISolver (2) Som parametre til fjernprocedurekald - interface.
Lektion 7 Læsestof: Kopier fra Caranno
Mønstre En lille introduktion. Singleton Tilgå et objekt igennem klassereference i stedet for objektreference.  Overflødiggør referencer til objektet.
Eksempel på realisering af domænemodel
FEN KbP/seminar2: design11 Kontraktbaseret programmering Seminar 2 Klassedesign – grundprincipper Eksempler: Stack Dictionary.
Forelæsning 5.1 Brug af klassen Collections og interfacet Comparable samt parametriserede typer Projektuge: Ants and Spiders / Lommeregner dIntProg,
10. Datastrukturer. 2 Nordjyllands Erhvervakademi Collections library Datastrukturer i.NET kaldes normalt Collections Findes i namespace System.Collections.
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper: arrays, stakke, køer,
Repetition: Introduktion til OOP med C# og .NET
Comparable Students German Students Composite Pattern State Pattern Observer Pattern Collections Interfaces Abstrakte klasser Design Patterns.
FEN KbP/seminar2: design21 Kontraktbaseret programmering Seminar 2 Klassedesign: Immutable lister Queue Shallowcopy og alkvantoren.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
FEN IntroJava AAU1 Klasser og objekter Grundbegreber Student-Course.
FEN IntroJava AAU1 Endnu mere om Klasser og Objekter Mange til mange relationer Student-Course v3.
KF04 GRAY Item 2, 12, 22, 32, 42, 52. Consider a builder when faced with many constructor parameters Item 2.
03 – Udtryk og metoder. 2 NOEA2009Java-kursus – Udtryk og metoder Udtryk i Java Java har standard udtrykene… Værditildeling Subrutiner og funktionskald.
Opfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner findEn findAlle Primitive typer (forfremmelse og begrænsning) Identitet versus lighed.
9. Interfaces. 2 Nordjyllands Erhvervakademi Objectives “Good class design starts with good application design — how many classes, do they relate.
Blå gruppe: Søren, Alexander, Torben, Lasse. De 4 vigtige items: - Singelton - Override clone judiciously - Use interfaces only to define type - Prefer.
Begreber og Redskaber 11. Plan for idag Lidt afrunding: Collections Framework i Java Noget om oversættere og sprog Evaluering Sidste gang øvelser før.
Forelæsning 7.1 – repetition
Identitet vs lighed. Spørgsmål Hvad udskriver run metoden? 1.”Ens!” 2.”Forskellige!” 3.Ved ikke public class Driver{ public static void run(){ String.
Paradigmer i Programmering 3. Højere ordens funktioner Idag: Højere ordens funktioner Algebraiske datatyper Næste gang: I/O, Filer, interaktive programmer.
Begreber og Redskaber 4. Plan for idag Om metoder, parametre, returværdier Et par ord om objekt-orientering Håndkøring af programmer.
Begreber og Redskaber 3. Plan for idag Om metoder, parametre, returværdier Overblik over klasser,objekter,nedarvning Et par ord om objekt-orientering.
I o p o DAIMI, AU, November 1999Programkonstruktion I9E.1 Konstruktion og brug af klasser – en stak og en HP-regnemaskine push pop.
 Henrik B. Christensen, 1999Introducerende objektorienteret programmering8B.1 Interfaces En ren kontrakt.
 Jens Bennedsen, 2003Introducerende objektorienteret programmeringinterfaces.1 Interfaces En ren kontrakt.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Interfaces Afkobling af programkomponenter (eksempel: Comparable)
Kari Rye Schougaard, Ph.d.-stud. Værktøjer og Teknikker, 2006 A A R H U S U N I V E R S I T E T DATALOGISK INSTITUT Java på 20 minutter (eller lidt mere)
Programmering med interfaces Separering af specifikation, anvendelse og implementation.
Klasser og objekter – grundbegreber.  Michael E. Caspersen, 2001Introducerende objektorienteret programmeringKlasser og objekter.2 Klasser og objekter.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Collectionklasser Klassifikation og anvendelse. dIntProg, F08Collectionklasser.2 Samlinger af objekter Objektreferencer –for at holde fast i et objekt.
Interfaces – hvorfor, hvad og hvordan?.  Michael E. Caspersen 2003IOOPInterfaces.2 Oversigt Interfaces, hvorfor –Separering af specifikation (interface)
 Jens Bennedsen 2001Multimedie programmering10B.1 Interfaces En ren kontrakt.
Introduktion til programmering Repetition. dIntProg, F08Repetition.2 dIntProg Sidste forelæsning (12/10) –kort tilbagemelding på evaluering –repetition.
DAIMIIntroducerende Objektorienteret Programmering8B.1 Interfaces En ren kontrakt.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Containerklasser – klassifikation og brug.  Michael E. Caspersen, 2003IOOPContainerklasser.2 Mange objekter Containerklasser –antag at man skal repræsentere.
Forelæsning Uge 5 – Mandag
Forelæsning Uge 6 – Mandag
Forelæsning Uge 11 – Torsdag
Forelæsning Uge 4 – Mandag
Forelæsning Uge 5 – Mandag
Forelæsning Uge 12 – Torsdag
Forelæsning Uge 6 – Mandag
Forelæsning Uge 3 – Mandag
Parametrisering En kort introduktion.
Forelæsning Uge 3 – Mandag
Forelæsning Uge 4 – Torsdag
Præsentationens transcript:

Effective Java Blå gruppe

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

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();}

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

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.

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…)

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

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

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

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.

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

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 –

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

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) ?

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

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

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()

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!

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!

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

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!

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!

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

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!

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

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!

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 ?

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