Föreläsning 4. Polymorfism. Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder

Relevanta dokument
Föreläsning 4 Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder

Föreläsning 4. Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder. Abstraction & Information Hiding

Föreläsning 2. Polyfmorfism Dynamisk bindning Interface och abstrakta klasser Överlagring Överskuggning Accessorer och mutatorer

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Instuderingsuppgifter läsvecka 2

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

DAT043 - Föreläsning 7

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

DAT043 - föreläsning 8

Klasshierarkier - repetition

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Objektorienterad Programmering (TDDC77)

Kopiering av objekt i Java

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Arv innebär att man skapar en ny klass (subklass) utifrån en redan existerande klass (superklass, basklass).

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

TDDD78, TDDE30, 729A Typhierarkier del 2 Vad krävs? Hur fungerar det?

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Tentamen ID1004 Objektorienterad programmering December 15, 2012

Objektorienterad Programmering (TDDC77)

Objektorienterad Programmering (TDDC77)

Outline. Objektorienterad Programmering (TDDC77) Laborationsserie del två. Vad händer under HT2. Introduktion HT2 UML.

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Ett objekt... Exempel: Om ni tittar er runt i föreläsningssalen ser in många olika fysiska föremål:

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Repetition av OOP- och Javabegrepp

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

OOP Objekt-orienterad programmering

TDA550 Objektorienterad programmering, fortsättningskurs. Föreläsning 1. Introduktion Variabler och typer

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Repetition av OOP- och Javabegrepp

TDDD78 Objektorientering i Java, del 2

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

Sammansatta datatyper Generics: Parametrisk polymorfism

Introduktion till arv

Föreläsning 6. Använd beskrivande namn

Föreläsning 13 Innehåll

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Polymorfi. Objektorienterad och komponentbaserad programmering

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Classes och Interfaces, Objects och References, Initialization

Objektorientering: Lagring, räckvidd och livstid

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Objektorientering: Lagring och livstid

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Kort om klasser och objekt En introduktion till GUI-programmering i Java

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

Enkla variabler kontra referensvariabel

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Arv och polymorfism i Java

Generic type declarations. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Laboration 1 - Grunderna för OOP i Java

Objektorienterad programmering

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Konstruktion av klasser med klasser

Generics och polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDD78 Objektorientering: Lagring och livstid

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Objektorienterad programutveckling, fk

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Programmering = modellering

Föreläsning 5. Föreläsning 5. Klasser och objekt. Klasser och objekt. Klasser och objekt

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 5. När skall man använda implementationsarv? När skall man använda implementationsarv?

Imperativ programmering. Föreläsning 4

Modeller, Objekt och Klasser

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 5. Föreläsning 5

OOP Objekt-orienterad programmering

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

Transkript:

Föreläsning 4 Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder Statiska och dynamiska typer Den deklarerade typen hos en variabel är variabelns statiska typ. Typen på det objekt som en variabel refererar till är variabelns dynamiska typ. Typinformationen används vid två olika tillfällen vid kompilering (compile time) och vid exekvering (run time). Det är kompilatorns uppgift att utföra statisk typkontroll. Den statiska typinformationen används endast vid själva kompileringen, efter kompileringen är den borta. Under exekvering används den dynamiska typinformationen. Runtime-systemet gör dynamisk typkontroll. Polymorfism Java tillåter att man till en variabel av en viss typ C kan tilldela objekt som är av typ C eller är av en subtyp till C. Egenskapen att ett objekt som är en subtyp till typen C legalt kan användas där ett objekt av typen C förväntas kallas polymorfism. Polymorfism är ett av de viktigaste koncepten i objektorientering och är den grundläggande tekniken i objektorientering för att åstadkomma återanvändbar kod. Polymorfism kommer från grekiska poly morf, som betyder många former. Polymorfism möjliggör att en användare som endast utnyttjar generella egenskaper hos ett objekt (=egenskaper som definieras i superklassen) inte behöver känna till exakt vilken typ objektet tillhör. 3 4

Betydelsen av polymorfism Antag att vi på många ställen i ett programsystem skapar och använder objekt av den konkreta klassen LinkedList enligt: private LinkedList list = new LinkedList();... public void somemethod(linkedlist list) {... }//somemethod En del av klasserna och interfacen i Javas Collection-Framework visas i bilden bredvid. Kan vi med den kunskap som bilden ger, göra vårt programsystem mer flexibelt och mindre känsligt med avseende på förändringar? <<interface>> Collection <<interface>> List ArrayList LinkedList 6 Betydelsen av polymorfism LinkedList list = new LinkedList(); list kan bara vara av typen LinkedList Vidga typtillhörigheten List list = new LinkedList(); Vidga typtillhörigheten Collection list = new LinkedList(); Använd en factory-metod Factory factory = new Factory(); Collection list = factory.createnewlist(); public class Factory {... public Collection createnewlist() { return new LinkedList(); }//createnewlist }//Factory list kan vara av godtycklig subtyp till interfacetypen List list kan vara av godtycklig subtyp till interfacetypen Collection list kan vara av godtycklig subtyp till interfacetypen Collection. I koden där list deklareras skapas objektet utan kunskap om dess konkreta typ. Objektet skapas av en fabriksmetod. Den konkreta subtypen nämns bara på ett ställe. Lätt att ändra! 7

The Dependency Inversion Principle (DIP): Design som strider mot DIP. PolicyLayer MechanismLayer UtilityLayer Policy Design som följer DIP. PolicyLayer De konkreta klasserna kan under exekveringen bytas ut med andra konkreta klasser som implementerar respektive interface. <<interface>> PolicyInterface Mechanism MechanismLayer <<interface>> MechanismInterface Utility UtilityLayer 10 Vad menas med dynamisk bindning Avsaknad av dynamisk bindning Antag att vi har de tre klasserna, Minivan och SportCar för att avbilda tre olika typer av bilar: I objektorientering används generella namn på operationer/metoder som skall kunna appliceras på objekt av olika typer: Vehicle v1 = new Car(); v1.turnleft(); Vid statisk bindning bestäms vilken operation/metod som skall anropas vid kompileringen, d.v.s. den statiska typen på objektet är avgörande för valet. Vid dynamisk bindning bestäms vilken operation/metod som skall anropas vid exekveringen, d.v.s. den dynamiska typen på objektet är avgörande för valet. SportCar Minivan +getnrofpassengers():int +getcapacity():int +getnrofseats():int Klasserna, Minivan och SportCar har bl.a. metoder som returnerar hur många passagerare som ryms i respektive biltyp (metoderna getnrofpassengers(), getcapacity() respektive getnrofseats(). 11 12

Avsaknad av dynamisk bindning Eftersom, Minivan och SportCar är subtyper till är följande kod legal: [] fleet = new [3]; fleet[0] = new (); fleet[1] = new Minivan(); fleet[2] = new SportCar(); Fältet fleet innehåller således element från tre olika klasser. Antag nu att vi vill ta reda på den totala passagerarkapaciteten för objekten som finns i fältet fleet. 13 Lösning med användning av dynamisk bindning Refaktorera genom generalisering, d.v.s. inför en abstrakt superklass som innehåller de gemensamma delarna för subklasserna, Minivan och SportCar. +getcapacity():int {abstract} +getcapacity():int SportCar +getcapacity():int Minivan +getcapacity():int Klassen har den abstrakta metoden getcapacity() som returnerar antalet passagerare. Metoden getcapacity() överskuggas (overrides) i de tre subklasserna. Lösning med användning av dynamisk bindning Eftersom, Minivan och SportCar är subtyper till är följande kod legal: [] fleet = new [3]; fleet[0] = new (); fleet[1] = new Minivan(); fleet[2] = new SportCar(); Fältet fleet innehåller således element från tre olika klasser. Antag nu att vi vill ta reda på den totala passagerarkapaciteten för objekten som finns i fältet fleet. 15 16

Hur fungerar dynamisk bindning Hur fungerar dynamisk bindning Två steg som är inblandade när det gäller anropet av fleet[i].getcapacity(): Det första steget, typcheckning, sker under kompileringen. Typcheckningen garanterar att en metod med rätt signatur existerar och kan anropas vid exekveringen. Under exekveringen skall den korrekta/avsedda implementation av metoden getcapacity() väljas. Det andra steget sker under exekveringen, då rätt metod väljs utifrån objektets dynamiska typ. I vårt exempel är metoden getcapacity() överskuggad i samtliga subklasser till. När kompilatorn ser att fleet[i] är deklarerad av typen, börjar kompilatorn att söka efter metoden getcapacity() i klassen. sökväg Elementet fleet[i] har den statiska typen Sökväg för att finna fleet[i].getcapacity() börjar i Det är denna överskuggning av metoden getcapacity() som är hela hemligheten till att vår lösning i VERSION 2 fungerar. +getcapacity: int Vad hade hänt om någon subklass inte överskuggat metoden getcapacity()? Vad hade hänt om metoden getcapacity() inte funnits i klassen? +getcapacity: int 19 20

Hur fungerar dynamisk bindning Överskuggning och kovarianta returtyper Vid exekveringen påbörjas sökningen efter metoden getcapacity() i den klass till vilken det anropande objektet hör, d.v.s. den dynamiska typen hos referensvariabeln. Har denna klass ingen sådan metod genomsöks kedjan av klassens superklasser tills metoden påträffas. Metoden kommer med säkerhet att påträffas, annars hade kompileringen misslyckats. (Varför?) För anropet fleet[0].getcapacity() påbörjas sökningen i klassen, eftersom objektet som fleet[0] refererar till är ett objekt av klassen. Metoden getcapacity() finns i klassen, således är det denna metod som kommer att exekveras. Automoblie +getcapacity() fleet[0] instans av : +getcapacity() Java tillåter att returtypen för en överskuggande metod är en subtyp till returtypen för metoden som överskuggas. Detta kallas kovarians. Fördelen med kovarians är ökad typsäkerhet - mindre behov av osäkra typomvandlingar när överskuggade metoder anropas. sökväg Elementet fleet[0] har den dynamiska typen Sökväg för att finna fleet[0].getcapacity() börjar i 21 22

Överlagring, överskuggning och hiding Signaturen för en metod bestäms av vilka typer som parametrarna i metodens parameterlista har. Returtypen ingår inte i signaturen. Två signaturer är lika om antal, typ och ordning på parametrarna är identiska. Om två metoder i samma klass har samma namn, men olika signaturer, är namnet på metoderna överlagrat (overloaded). Överlagring (overloading) betyder alltså att ett metodnamn namnger två eller flera helt skilda metoder i samma klass. Överskuggning (overriding) däremot involverar en superklass och en subklass, och berör två instansmetoder som har samma metodsignatur den ena metoden finns lokaliserad i superklassen och den andra metoden finns lokaliserad i subklassen. Om en superklass och en subklass båda definierar en klassmetod med samma namn och signatur, kallas detta för hiding. 27 Överlagring Exemel: I klassen String finns metoderna public String substring(int beginindex) public String substring(int beginindex, int endindex) Dessa metoder är överlagrade - de har samma namn men olika signaturer. Naturligtvis skall överlagring användas om och endast om de överlagrade metoderna i allt väsentligt gör samma sak (som substring ovan). När parametrarna i de överlagrade metoderna är primitiva datatyper, som i substring-metoderna ovan, är det enkelt att förstå vilken metod som blir anropad. Det är svårare att förstå vilken metod som verkligen blir anropad när parametrarna utgörs av referenstyper och därför kan anropas med subtyper till de typer som anges i parameterlistan. Överlagring ett exempel Låt oss titta på klasserna och igen. Eftersom alla klasser i Java är subklasser till ärver bl.a. en metod med följande metodhuvud: public boolean equals( obj) (1) Antag nu att vi lägger till en metod i klassen som har metodhuvudet: public boolean equals( auto) (2) +equals(): boolean +equals(): boolean Observera att parametern till equals i har typen, medan parametern till equals i har typen. 28 29

Överlagring ett exempel Klasserna och har nu två metoder med namnet equals - en deklarerad i klassen och en deklarerad i klassen. Dessa båda metoder är alltså överlagrade (inte överskuggade). Betrakta nedanstående kodavsnitt: o = new (); auto = new (); auto = new (); auto.equals(o); auto.equals(auto); auto.equals(auto); +equals(): boolean +equals(): boolean Kan du för vart och ett av de tre anropen av equals ovan avgöra om metoden i exekveras eller den ärvda metoden från? 30 Överlagring hur det fungerar vid kompilering När kompilatorn ser ett anrop t.ex. auto.equals(o) händer följande: 1. Kompilatorn tar reda på vilken deklarerad typ auto har. 2. Kompilatorn tittar i den aktuella i klassen (eller interfactet) och i dess superklasser (eller superinterface) efter alla metoder med namnet equals. 3. Kompilatorn tittar på parameterlistorna för dessa metoder och väljer den parameterlista vars typer bäst överensstämmer med de deklarerade (d.v.s. statiska) typerna som skickas i det aktuella anropet. I anropet auto.equals(o), är auto av typen och o av typen. Parametertypen för equals-metoden i är to narrow, eftersom denna är av typen. Således väljs equals() i klassen. +equals(): boolean +equals(): boolean sökväg equals() Kompilering 31 Överlagring hur det fungerar vid exekvering Vid runtime skall metoden med den signatur som kompilatorn valt letas upp. Sökningen startar i det anropande objektets klass. Har denna klass ingen sådan metod genomsöks kedjan av klassens superklasser tills metoden påträffas. (Den kommer att påträffas, annars hade det inträffat ett kompileringsfel.) Överlagring hur fungerar det För anropet auto.equals(auto) kommer kompilatorn att välja metoden equals(). Vid exekveringen startar sökningen i. Metoden påträffas i och det är denna equals-metod som kommer att exekveras. För anropet auto.equals(o) påbörjas sökningen i och vi letar efter equals()-metoden som påträffas i klassen, således är det denna metod som exekveras. Söker efter equals() +equals() sökväg +equals() Söker efter equals() auto +equals() : sökväg auto : +equals() 32 För anropet auto.equals(auto) är parametern auto deklarerad som och equals i väljs (pga av samma orsaker som var fallet för anropet auto.equals(o)). 33

Övning 1: +equals(): boolean +equals(): boolean o = new (); auto = new (); auto = new (); Vilken metod väljs i nedanstående anrop: o.equals(o) o.equals(auto) o.equals(auto) auto.equals(o) auto.equals(auto) auto.equals(auto) Övning 2: Överskuggning Låt oss införa metoden public boolean equals( o) (3) i klassen. +equals(o:): boolean +equals(o:): boolean +equals(o:): boolean Detta innebär att överskuggar metoden som ärvs från. 34 35 Övning 2 forts: Överskuggning Övning 2 forts: Överskuggning Vad inträffar nu för de nio olika anropen vi diskuterade tidigare? o = new (); auto = new (); auto = new (); auto.equals(o); auto.equals(auto); auto.equals(auto); o.equals(o); o.equals(auto); o.equals(auto); auto.equals(o); auto.equals(auto); auto.equals(auto); o auto auto : : : instans av +equals() +equals() +equals() 36 Vad inträffar nu för de nio olika anropen vi diskuterade tidigare? o = new (); auto = new (); auto = new (); auto.equals(o); (3) auto.equals(auto); (2) auto.equals(auto); (3) o.equals(o); (1) o.equals(auto); (1) o.equals(auto); (1) auto.equals(o); (3) auto.equals(auto); (3) auto.equals(auto); (3) Obs! equals skall naturligtvis inte överlagras såsom gjorts i detta exempel!! 37

Åtkomstmodifierare Åtkomstnivåer När man säger att en subklass ärver data och metoder (implementation) från sin superklass, betyder detta inte nödvändigtvis att subklassen kan få direkt access till dessa i superklassen. I Java finns fyra olika synlighetsmodifierare: public protected utelämnad private tillåter access för alla klasser. tillåter access för alla klasser i samma paket samt för subklasser i andra paket. tillåter access för alla klasser i samma paket (paketsynlighet, eng. package private). tillåter access endast inom klassen själv. somepackage AClass no modifier public private SomeClass someotherpackage BClass SubClass2 SubClass1 SubClass2 protected utelämnad 38 39 Överskuggning och åtkomstnivåer När en subklass överskuggar en metod måste metoden i subklassen vara åtminstone lika synlig som den överskuggade metoden i superklassen. Åtkomst i superklass public protected package private private Åtkomst i subklasser public protected public package private protected public ingen Åtkomstmodifierare När skall man använda protected- eller paketåtkomst på medlemsvariabler? En bra tumregel är aldrig, eftersom den interna implementationen exponeras för subklasser, respektive för klasser i paketet. Ett undantag är när man har ett paket som utgör en integrerad komponent (subsystem), då kan det ibland vara motiverat på grund av effektivitetsorsaker. Dock kan detta innebära att en förändring i en klass kräver förändringar i andra klasser i paketet, men förändringarna är åtminstone begränsade till paketet. Detta följer, som vi senare skall se, från Liskov Substitution Principle. 40 41

Information Hiding Principle Information Hiding Principle En moduls interna struktur skall skyddas mot extern åtkomst En klass kan jämföras med ett isberg: Gränssnitt Väsentliga kännetecken enklare att hålla systemet i ett konsistent/legalt tillstånd implementationen av modulen kan ändras utan att det påverkar klienterna. Varje modul skall ha ett väldefinierat publikt gränssnitt genom vilket all extern åtkomst måste ske: informationen som klienter behöver för att använda klassen begränsas till ett minimum. 90% döljs under vattnet och endast 10% är synligt över ytan. Klienter skall inte veta något om hur gränssnittet är implementerat Interna ändringar i klassen skall inte beröra klienterna. Implementation klienterna skall bara veta hur modulen används, inte hur modulen är implementerad. Slutsats: Gör alla instansvariabler privata! 46 Oväsentliga detaljer 47 Access-metoder och mutator-metoder Vi gör en konceptuell skillnad mellan muterande metoder (mutator methods): metoder som förändrar tillståndet i ett objekt. Kallas också för setter-metoder accessmetoder (accessor methods): metoder som returnerar värdet av en instansvariabel. Kallas även för getter-metoder. Ett objekt som tillhör en klass som innehåller mutator-metoder kan ändra sitt tillstånd. En sådan klass är en muterbar (mutable) klass. Ett objekt som bibehåller samma tillstånd (som det får när det skapas) under hela sin livstid kallas för icke-muterbart (immutable). Icke-muterbara objekt tillhör en icke-muterbar klass. Ett nödvändigt (men, som vi senare skall se, inte tillräckligt) villkor för att en klass skall vara icke-muterbar är att klassen saknar muterande metoder. Klassen String och omslagsklasser som t.ex. Integer och Double, är exempel på icke muterbara klasser. 48

Access-metoder och mutator-metoder Antag att klassen Date har mutator-metoderna public void setyear(int year) public void setmonth(int month) public void setday(int day) och att en klient exekverar satserna Date firstddeadline = new Date(2010,1, 1); firstdeadline.setmonth(2); Day seconddeadline = new Date(2010,1, 31); seconddeadline.setmonth(2); Vad händer? Objektet seconddeadline hamnar i ett ogiltigt tillstånd, eftersom 31/2 inte är ett giltigt datum! Slutsats: Tillhandahåll inte slentrianmässigt set-metoder för alla instansvariabler! Eftersträva icke-muterbara klasser. 50