1 Comparator & Comparable

Relevanta dokument
TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 4

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Att skriva till och läsa från terminalfönstret

Kopiering av objekt i Java

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

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

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

1.1 Runnable och Thread

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Föreläsning 9. Generiska enheter Inre klasser Anonyma klasser Kloning

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

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

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

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

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

Lösningar för tenta 2 DAT043,

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

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

Objektorienterad Programkonstruktion. Föreläsning jan 2016

DAT043 - föreläsning 8

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

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Övning vecka 4. Denna vecka ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

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

Programmering för språkteknologer II, HT2014. Rum

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Objektorienterad Programmering (TDDC77)

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

Generiska konstruktioner. Kursbokens kapitel 13

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

DAT043 Objektorienterad Programmering

Lösningsförslag: Övning 5.

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Felhantering TDDD78, TDDE30, 729A

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Objektorienterad programmering D2

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

Föreläsning 2, vecka 8: Repetition

Del A (obligatorisk för alla)

Länkade strukturer, parametriserade typer och undantag

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Inga hjälpmedel tillåtna.

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

Objekt och klasser - Introduktion

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

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

Enkla variabler kontra referensvariabel

Exceptions (undantag) Murach s: kap 7

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Fördjupad Java. Undantagshantering. Fel

Klasshierarkier - repetition

Typkonvertering. Java versus C

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Objekt, Klasser, Paket m. m.

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

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

TENTAMEN: Objektorienterad programmering. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

Objektorienterad programmering i Java

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

OOP Objekt-orienterad programmering

Tentamen för TTIT71 Programmering kl Institutionen för datavetenskap Linköpings universitet. Uppgift 1. (2 p)

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

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

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Lösningsförslag till tentamen

Klassdeklaration. Metoddeklaration. Parameteröverföring

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

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

TUTORIAL: KLASSER & OBJEKT

Modeller, Objekt och Klasser

Tentamen FYTA11 Javaprogrammering

Transkript:

1 Comparator & Comparable 1.1 Implementation av Comparable Att implementera Comparable innebär att man gör objekt av sin klass jämförbara med andra och att det därmed antas existera en naturlig ordning för klassen. (Informellt kan tänkas att objekten ska kunna läggas på rad i storleksordning genom att par av objekt jämförs med varandra.) 1 Denna ordning bör vara en total ordning 2. Enligt kontraktet för ett anrop a.compareto(b) ska följande returneras 1. ett positivt heltal, om a > b 2. noll, om a == b 3. ett negativt heltal, om a < b Observera hur subtraktion används i modelyear - c.modelyear för att skapa ett returvärde från compareto() utan att använda if-satser eller liknande konstruktioner. Det rekommenderas starkt att metoden compareto() är konsistent med metoden equals(), d.v.s. för två objekt a och b där a.compareto(b) == 0 gäller att a.equals(b) == true och omvänt. Om detta inte gäller kan det t.ex. inträffa underligheter när objekten lagras i samlingar. 1.2 Implementation av en flexibel(?) Comparator För Comparator gäller det till stor del att tänka på motsvarande saker som när Comparable ska implementeras. (med metoden compare() som motsvarighet till compareto()), se därför kommentarerna till föregående uppgift ( Car implements Comparable ). En komparator tar typiskt in inställningar för hur jämförelsen ska gå till i konstruktorn och sparar dessa i sitt inre tillstånd (d.v.s. i instansvariabler). Inställningarna används sedan när jämförelser utförs genom metoden compare(). 1 Se Javas API: http://download.oracle.com/javase/6/docs/api/java/lang/comparable.html 2 http://en.wikipedia.org/wiki/total order 1

2 Strategimönstret 2.1 Numerisk integrering 3 Exceptions 3.1 Propagering av fel uppför anropsstacken 3.1.1 Om vi inte haft exceptions? Lösning void metod1() { do something A; success = metod2(); if (!success) doerrorprocessing; else do something B; boolean method2() { do something C; success = metod3(); if (!success) return false; else do something D; boolean method3() { do something E; success = readfile(); if (!success) return false; else do something F; 2

Poängen ligger i att observera hur felet som uppstår i readfile() och ska hanteras i metod1(), kräver att felhantering även införs i metod2() och metod3() (för att felet ska kunna propageras uppåt). 3.1.2 Exceptions räddar dagen? Lösning void metod1() { do something A; try { metod2(); catch(readfilefailedexception) { doerrorprocessing; do something B; boolean method2() throws ReadFileFailedException { do something C; metod3(); do something D; boolean method3() throws ReadFileFailedException { do something E; readfile(); do something F; Felhanteringen som tidigare gjordes manuellt med if-satser kan nu hanteras med exceptions. Det gör att felhanteringen dels blir tydligare (if-satser kan ju handla om annat än fel) och dels kan tas bort från kod som inte har med felet att göra. Innehållet i både metod2() och metod3() blir nu mycket renare. Metoderna uppmärksammar att något kan gå fel under körningen genom sina throws-deklarationer, men behöver inte hantera felet själva. Använd endast exceptions för sådant som är just undantag från kodens huvudsakliga uppgift, d.v.s. (i första hand) olika typer av fel. Om det inte 3

finns någon exekveringsväg i ett program som är helt fri från exceptions så är de inte just undantag. Låt aldrig ett catch-block stå tomt! Då kan ett fel inträffa utan att det upptäcks. Använd lämplig typ av exceptions beroende på kodens abstraktionsnivå. Låt t.ex. inte ett IOException kunna fångas i kod där programmeraren inte vet om att någon input/output inträffar. I ett sådant fall bör detta IOException fångas i den kod som handhar input/output och en mer lämplig typ av exception kastas vidare. Fånga aldrig ett Exception (alltså basklassen för alla exceptions). Det har en benägenhet att dölja fel. Fånga bara de exceptions du kan förvänta dig. 3.2 Arv av exceptions 3.2.1 Vad fångas I Det fångas eftersom ett NotAPositiveNumberException också är ett Not- ANumberException (genom arvsrelationen). 3.2.2 Vad fångas II Koden fungerar inte eftersom catch(notapositivenumberexception napne) inte kommer kunna nås. Av samma anledning som i föregående uppgift fångas alla NotAPositiveNumberException i catch(notanumberexception nane). 4 (Icke-)muterbarhet 4.1 Publika instansvariabler? Vi har minst två skäl att undvika publika instansvariabler: De kan tillåta andra objekt (av andra klasser) att manipulera vår interna representation direkt. Som en konsekvens blir det svårt att garantera att eventuella klassinvarianter håller. Den faktiska implementationen exponeras. Detta medför att vi vid ett senare tillfälle inte har möjlighet att ändra vår implementation om vi skulle behöva; typen hos variabeln blir en del av klassens externa kontrakt. 4

I ett fåtal fall kan det ändå vara rimligt att ha publika instansvariabler. Dessa måste då vara deklarerade final. I Pair-klassen kan man motivera det med att det som exponeras är just värdena; Pair har ingen implementationsdetalj som är beroende av vilka typer de olika delarna av paret har. 4.2 Vad gör final? Att deklarera en referens final innebär endast att själva referensen inte kan ändras (efter första tilldelningen). Innehållet i objektet referensen hänvisar till kan dock ändras. Man kunde tänka sig att detta problem skulle kunna lösas (garantera att Pair var strikt icke-muterbar) genom kloning. Typparametrarna skulle då istället bli <A extends Cloneable, B extends Cloneable>. Då klassen främst är till för att lösa problemet att man inte kan returnera tupler 3 i Java vill man inte skapa för många nya objekt i onödan; att vi behöver skapa det omgivande Pair-objektet är illa nog. Ett betydligt allvarligare problem är att man kan tänka sig flera innebörder av att vara Cloneable innebär. Om kopian är av typen djup eller grund spelar stor roll om man vill uppnå icke-muterbarhet. Se http://en.wikipedia. org/wiki/object_copy#deep_vs._shallow_vs._lazy_copy för en förklaring av grund kontra djup kloning. Kontentan är att vi kan garantera icke-muterbarhet om och endast om objekt av de klasser vi har som typparametrar också är strikt icke-muterbara. Klassinvarianten blir first and second will always have the same values as were passed to the constructor. Detta säger inte att klassen är icke-muterbar men att den parametriserad över rätt typer skulle kunna vara det. 3 http://en.wikipedia.org/wiki/tuple 5