Institutionen för TENTAMEN CTH VT-13 Datavetenskap TDA550 DAG: TID: 8:30 12:30

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

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

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Institutionen för TENTAMEN CTH HT-13 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

DAT043 Objektorienterad Programmering

Tentamen LÖSNINGSFÖRSLAG

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

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

Institutionen för TENTAMEN CTH VT-14 Datavetenskap TDA550 DAG: TID: 8:30 12:30

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

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

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

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Objektorienterad programutveckling, fk

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA550 DAG: TID: 14:00 18:00

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

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

1 Comparator & Comparable

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

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

Institutionen för TENTAMEN CTH HT-17 Datavetenskap TDA550

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

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

TENTAMEN OOP

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

Tentamen LÖSNINGSFÖRSLAG

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

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

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Tentamen LÖSNINGSFÖRSLAG

Objektorienterad programutveckling, fk

Tentamen Programmering fortsättningskurs DIT950

Tentamen i Objektorienterad modellering och diskreta strukturer

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

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Svaret kan ges i Javakod (eller i UML-klassdiagram). public class A { B minb;... } public class B { <B:s många variabler och metoder> } Lösning:

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.

TENTAMEN: Objektorienterad programutveckling, fk. Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad.

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

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

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

Föreläsnings 9 - Exceptions, I/O

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Lösningar för tenta 2 DAT043,

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-15, TDA540. Dag: , Tid:

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

Instuderingsuppgifter läsvecka 2

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

DAT043 - Föreläsning 7

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

PROGRAMMERINGSTEKNIK TIN212

Sammanfattning och repetition utgående från typiska tentamensuppgifter

LÖSNINGSFÖRSLAG

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tentamen i Objektorienterad modellering och diskreta strukturer

Lösningsförslag till tentamen

Kopiering av objekt i Java

Språkkonventioner och redigering av tal.

CHALMERS TENTAMEN. 2012/2013, lp 1 DAT042. Uno Holmer. Java API (utdelas av skrivningsvakten) Erland Holmström tel besöker tentamen

Lösningsförslag till tentamen

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

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

Enkla variabler kontra referensvariabel

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

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

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

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Institutionen för TENTAMEN CTH VT-17 Datavetenskap TDA550

TENTAMEN OOP

Sammanfattning och repetition utgående från typiska tentamensuppgifter

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

Institutionen för TENTAMEN CTH VT-14 Datavetenskap TDA550 DAG: TID: 8:30 12:30

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

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

OOP Objekt-orienterad programmering

Tentamen, EDAA10 Programmering i Java

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

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

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

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

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

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

CHALMERS TENTAMEN. 2018/2019, lp 1 DAT050. Uno Holmer

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

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

Transkript:

Institutionen för TENTAMEN CTH VT-13 Datavetenskap 2013-04-02 TDA550 Tentamen för TDA550 Objektorienterad programvaruutveckling IT, fk DAG: 13-04-02 TID: 8:30 12:30 Ansvarig: Christer Carlsson, ankn 1038 Förfrågningar: Resultat: Christer Carlsson erhålls via Ladok Betygsgränser: 3:a 24 poäng 4:a 36 poäng 5:a 48 poäng maxpoäng 60 poäng Siffror inom parentes: Granskning: Hjälpmedel: Var vänlig och: Observera: anger maximal poäng på uppgiften. Måndag 29/4 kl 10-13 rum 6128 i EDIT-huset. Inga hjälpmedel är tillåtna förutom bilagan till tesen. Skriv tydligt och disponera papperert på lämpligt sätt. Börja varje uppgift på nytt blad. Skriv ej på baksidan av papperet. Uppgifterna är ej ordnade efter svårighetsgrad. Titta därför igenom hela tentamen innan du börjar skriva. Alla program skall vara välstruktruerade, lätta att överskåda samt enkla att förstå. Vid rättning av uppgifter där programkod ingår bedöms principella fel allvarligare än smärre språkfel. LYCKA TILL!!!!

Uppgift 1. Betrakta nedanstående gränssnitt och klasser: public interface IA { public void doa(); //IA public interface IB { public void dob(); //IB public class A implements IA { public void doa() { System.out.println("A doa"); public C doit(){ return new C(); //A public class D extends C { public void doa() { System.out.println("D doa"); //D public class B extends A { public void doa() { System.out.println("B doa"); public void doit(int i){ i++; //B public class C extends A implements IB { public void doc() { System.out.println("C doc"); public void dob() { System.out.println("C dob"); public D doit() { return new D(); //C a) Rita ett UML-diagram över klasserna och gränssnitten. b) Vad blir resultatet för var och en av följande kodavsnitt (ger kompileringsfel, ger exekveringsfel, skriver ut xxx, etc)? i) IA ia = new C(); IB ib = ia; ia.doa(); ii) IA ia = new C(); IB ib = (IB) ia; ib.dob(); iii) IA ia = new B(); IB ib = (IB) ia; ia.doa(); iv) vii) IB ib = new C(); C c = (C) ib; IA ia = c; ia.doa(); A a = new B(); B b = (B)a; b.doit(1.0); v) B b = new C(); b.doa(); viii) A a = new C(); D d = a.doit(); d.doc(); vi) C c = (C) new B(); c.doc(); (9 poäng)

Uppgift 2. Nedanstående metod ingår i en klass för att handha bilflottan i en biluthyrningsfirma. Metoden kontrollerar om varje bil behöver tankas. Om så är fallet, tas reda på hur mycket bränsle som behöver fyllas på, varefter tankningen utförs. Betrakta metoden med designprincipen Separation of Concerns i åtanke, och gör en refaktoring av koden så att denna princip följs. public void refuel() { for (Car c: cars) { if (c.needsfuel()) { Fuel amount = c.fuelamountneeded(); c.refuelcar(amount); //refuel (3 poäng) Uppgift 3. a) Java tillhandahåller både kontrollerade och okontrollerade undantag (checked and unchecked exceptions). En metod som kan ge upphov till ett kontrollerat undantag måste antingen fånga undantaget eller specificera i metodhuvudet, med en throws-klausul, att metoden kan kasta detta undantag. Varför handhas inte alla undantag på detta sätt? Med andra ord, varför finns det okontrollerade undantag som varken behöver fångas eller anges i metodhuvudet? b) Ibland fångar man, som i koden nedan, ett undantag och kastar omedelbart ett nytt undantag. public void dosomething() throws SomeOtherException { try { //code that might cause an IOException catch (IOException e) { throw new SomeOtherException(); //dosomething Varför kan detta vara en lämplig åtgärd att göra? (4 poäng) Uppgift 4. Betrakta följande klass för att avbilda ett bankkonto public class Account { private double balance; public double revenue(int days) { double interest = 0.04; return balance * days * interest / 365; // other methods omitted //Account Det går inte att förändra formeln för att beräkna ränteavkastningen i metoden revenue utan att kompilera om klassen. Gör om designen, med användning av designmönstret Strategy, så att det under exekveringen blir möjligt att byta algoritm för ränteavkastningen. Lösningen redovisas i Java-kod och skall innehålla två algoritmer för ränteavkastning: algoritmen i koden ovan, som ger en avkastning på 4% på aktuellt saldo en algoritm som ger en avkastning på 4% på aktuellt saldo upp till 250000 och 6% på saldot som överskrider 250000 (6 poäng)

Uppgift 5. Betrakta nedanstående Java klasser: public class BaseClass { protected void amethod() throws Exception {... //BaseClass public class FirstSubClass extends BaseClass { private void amethod() throws Exception {... //FirstSubClass public class SecondSubClass extends BaseClass { public void amethod() throws Exception {... //SecondSubClass public class ThirdSubClass extends BaseClass { protected void amethod() {... //ThirdSubClass a) Går det att kompilera klassen FirstSubClass. Motivera ditt svar! b) Går det att kompilera klassen SecondSubClass. Motivera ditt svar! c) Går det att kompilera klassen ThirdSubClass. Motivera ditt svar! Tips: The Liskov substitution principle! (3 poäng) Uppgift 6. Betrakta metoden appendelements nedan, som tar två listor (source och destination) och lägger in elementen i listan source sist i listan destination: /** @pre: source!= null && destination!= null @post: the elements in the list source have been appended to the list destination **/ public static void appendelements(list source, List destination) { for (Object k : source) destination.add(k); //appendelements a) Ge en ny signatur för denna metod genom att använda generiska typparametrar på så sätt att metoden typkontrollerar och endast accepterar List-parametrar som har samma elementtyp. Med andra ord, den nya metodsignaturen skall acceptera samma typ på både source och destination, t.ex. att båda är List<String> eller båda är List<Integer>, men inte att en av parametrarna är List<String> och den andra är List<Integer>. b) Ge en bättre version av signaturen genom att använda wildcards (?,? extends och/eller? super) så att metoden typkontrollerar och accepterar parametrar där elementen från listan source kan lagras i listan destination även om elementen i source är en subtyp till elemententypen för listan destination. (4 poäng)

Uppgift 7. I ett programsystem för att hantera tärningsspel finns gränssnittet public interface Die { void roll(); int getvalue(); //Die samt klassen // rolls the die // returns the face value public class StandardDie implements Die { //code not shown here //StandardDie som implementerat en vanlig sexsidig tärning. <<interface>> Die +roll(): void +getvalue(): int StandardDie Nu behöver man ha tillgång till tärningar som aldrig upprepar föregående utfall vid nästföljande kast. En sådan tärning ger t.ex. aldrig två sexor i följd. Din uppgift är att implementera klassen public class NoRepeatDie implements Die genom att använda designmönstert Decorator. Klassen NoRepeateDie har, förutom metoderna som specificeras av gränssnittet Die, även metoden public void norepeatroll() som skiljer sig från metoden roll genom att den aldrig ger samma värde två gånger i följd. (6 poäng) Uppgift 8. Betrakta klassen Interval nedan, som används för att avbilda ett tidsintervall. Starttid och sluttid representeras med objekt av standardklassen java.util.date (som är muterbar och implementerar gränsnittet Cloneable). Klassen riskerar att exponera den inre representationen. Åtgärda koden på så sätt att risken för exponering elimineras. Gränssnittet för klassen får inte förändras. import java.util.date; public class Interval { private final Date start; private final Date end; public Interval(Date start, Date end) { this.start = start; this.end = end; public Date getstart() { return this.start; public Date getend() { return this.end; //Interval (3 poäng)

Uppgift 9. Klassen Student, nedan, används för att avbilda en elev och vilken poäng eleven fått på en tenta: public class Student implements Comparable<Student> { private String name; private double score; public Student(String name, double score) { this.name = name; this.score = score; public String getname() { return name; public double getscore() { return score; public String tostring() { return name + ": " + score; public int compareto(student other) { return name.compareto(other.name); //Student Din uppgift är att komplettera klassen Grades, som används för att hålla reda på vilka elever som fått vilket betyg på kursen. import java.util.*; public class Grades { public Map<String, Set<Student>> grades; private double[] cutoffs; private static final String[] lettergrades = {"MVG", "VG", "G", "IG"; public Grades(double[] cutoffs) { //skall implementeras i deluppgift a) public String findgrade(double score) { //skall implementeras i deluppgift b) public void add(student student, double score) { //skall implementeras i deluppgift c) public Set<Student> get(string grade) { //skall implementeras i deluppgift d) //Grades Betyget avbildas som en sträng och betygen "MVG", "VG", "G" och "IG" kan erhållas. Klassen använder en Map, i vilken nyckel-värdeparet utgör av betyget (en objekt av klassen String) och ett Set av eleverna (objekt av klassen Student) som erhållit detta betyg. a) Implementera konstruktorn. Parametern cutoff specificerar betygsgränserna för betygen "MVG", "VG" och "G". Poäng under betygsgränsen för "G" ger betyget "IG". b) Implementera metoden findgrade. Metoden skall returnera vilket betyg som poängen som anges av parametern score motsvarar. c) Implementera metoden add. Metoden tar en elev och elevens poäng och lägger in eleven i Map:en grades. d) Implementera metoden get, som returnerar ett Set med alla elever som har ett viss betyg. Eleverna skall vara sorterade i alfabetisk ordning på sina namn (vilket är den naturliga ordningen som definieras av metoden compareto i klassen Student). (8 poäng)

Uppgift 10. Betrakta nedanstående klass: public class Product { private String name; private String description; private int price; private int stocknumber; //code not of interest here //Product Klassen behöver förses med metoderna equals och hashcode. Nedan ges tre möjliga implementationer av equals respektive tre möjliga implementationer av hashcode: equals version 1: public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass()!= obj.getclass()) return false; Product other = (Product) obj; return this. stocknumber == other.stocknumber ; equals version 3: public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass()!= obj.getclass()) return false; Product other = (Product) obj; return this.name.equals(other.name) && this.description.equals(other.description); equals version 2: public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass()!= obj.getclass()) return false; Product other = (Product) obj; return this.name.equals(other.name) && this. stocknumber == other.stocknumber ; hashcode version 1: public int hashcode() { return stocknumber; hashcode version 2: public int hashcode() { return name.hashcode() + stocknumber; hashcode version 3: public int hashcode() { return name.hashcode(); a) Med vilka versioner av equals kan version 1 av hashcode kombineras utan att bryta det kontrakt som The Java Language Specification specificerar. Motivera ditt svar! b) Med vilka versioner av equals kan version 2 av hashcode kombineras utan att bryta det kontrakt som The Java Language Specification specificerar. Motivera ditt svar! c) Med vilka versioner av equals kan version 3 av hashcode kombineras utan att bryta det kontrakt som The Java Language Specification specificerar. Motivera ditt svar! (6 poäng)

Uppgift 11. I ett system för att presentera resultat i en idrottstävling lagras resultaten i en textfil med följande utseende: 1. Aukland, Jörgen 03:50:48 2. Tynell, Daniel 03:50:50 3. Aukland, Anders 03:50:51... Inläsningen av textfilen och visning av resultaten handhas av de två nedanstående klasserna Database respektive Display. Nedan ges också en main-metod som visar hur klasserna används. import java.io.*; import java.util.*; public class Database { private String resultfile; public Database(String resultfile) { this.resultfile = resultfile; //constructor public String gettable() { Scanner in = null; try { in = new Scanner(new File(resultFile)); catch (FileNotFoundException e) { System.out.println("Cannot open " + resultfile); System.exit(0); StringBuffer b = new StringBuffer(); while (in.hasnextline()) b.append(in.nextline()+"\n"); return b.tostring(); //gettable //Database public class Display extends Thread { private Database db; public Display(Database db) { this.db = db; //constructor @Override public void run() { while(!interrupted()) { try { sleep(5000); catch(interruptedexception e) { show(db.gettable()); //run private void show(string result) { //code not shown here //show //Display public static void main(string[] args) { Database db = new Database(args[0]); Display dp = new Display(db); dp.start();... //main Din uppgift är att göra en ny implementation av klasserna Database och Display. I den nuvarande designen exekveras klassen Display i en egen tråd som var 5:e sekund anropar metoden gettable() i klassen Database för att erhålla en uppdaterad version av innehållet på resultatfilen. I den nya implementationen skall designmönstert Observer användas, genom att klassen Database själv ser till att läsa filen var 5:e sekund och utannonsera att så har skett. Detta innebär att klassen Database dels skall utöka klassen Observable (för att kunna utannonsera att läsningen skett), dels implementera gränssnittet Runnable (för att kunna göra inläsningen var 5:e sekund), och att klassen Display skall implementera gränssnittet Observer (för att kunna observera att inläsningen skett). När klassen Database meddelar observatörerna att textfilen är inläst bifogas den lästa texten som argument. a) Gör den nya implementationen av klassen Database enligt direktiven ovan. b) Gör den nya implementationen av klassen Display enligt direktiven ovan. c) Ge en main-metod som visar hur de nya klasserna används. Anm: PropertyChangeSupport och PropertyChangeListener får användas istället för Observable och Observer. (8 poäng)

Uppgift 1. a) Tentamen 130402- LÖSNINGSFÖRSLAG <<interface>> IA doa(): void A doa(): void doit(): C <<interface>> IB dob(): void B doa(): void doit(int): void C doc(): void dob(): void doit(): D D doa(): void b) i) Satsen IB ib = ia; ger ett kompileringsfel, eftersom IB inte är en supertyp till IA. ii) iii) iv) Skriver ut C dob Ger ett exekveringsfel, eftersom B cannot be cast to IB Skriver ut A doa v) Satsen B b = new C(); ger ett kompileringsfel, eftersom B inte är en supertyp till C vi) vii) Satsen C c = (C) new B(); ger ett kompileringsfel,c och B är inkompatibla typer Ger ett kompileringsfel eftersom metoden inte b.doit(1.0); inte finns i B viii) Satsen D d = a.doit(); ger ett kompileringsfel eftersom vi har inkompatibla typer. A har den statiska typen A och metoden doit i klassen A är en void-metod.

Uppgift 2. public void refuel() { for (Car c: cars) { refuelifneeded(c); //refuel public void refuelifneeded(car c) { if (c.needsfuel()) { calculateandrefuel(c); //refuleifneeded private void calculateandrefuel(car c) { Fuel amount = c.fuelamountneeded(); c.refuelcar(amount); //calculateandrefuel Uppgift 3. a) Okontrollerade undantag indikerar i allmänhet programmeringsfel. De kan dyka var som helst i koden. Att tvingas ange dessa som en del i dokumentationen av metodens gränssnitt skulle överhopa dokumentationen med ganska meningslös information. Ett programmeringsfel skall åtgärdas så snart som möjligt, så ju tidigare det inträffar ju bättre. Kontrollerade undantag indikerar ovanliga eller oväntade händelser som att misslyckas med att öppna en fil eller tappa en nätverksanslutning. Även om de inte förväntas inträffa, kan de vara saker som klienten kanske vill kunna åtgärda. Det är viktigt att dokumentera dem som en del av gränssnittet för en metod, oavsett om metoden fångar dem eller kastar dem vidare. b) Detta är lämpligt när undantaget som fångas relateras till implementationen, man vill rapportera felorsaken till klienten i termer som härrör till specifikationen.

Uppgift 4. public class Account { private float balance; private RateEstimation estimation; public Account(float balance){ this.balance = balance; public float revenue(int days, RateEstimation estimation) { return estimation.calculate (days, balance); // other methods omitted //Account public interface RateEstimation { public double calculate(int days, double balance); // RateEstimation public class FixedRate implements RateEstimation { public double calculate(int days, double balance) { double interest = 0.04; return balance * days * interest / 365; // calculate // FixedRate public class LevelRate implements RateEstimation { public double calculate(int days, double balance) { double interest = 0.04; if (balance > 250000) return balance * days * 1.5 * interest / 365; else return balance * days * interest / 365; // calculate // LevelRate Uppgift 5. a) Klass FirstSubClass går inte att kompliera. Orsaken är att klassen FirstSubClass begränsar synligheten av metoden amethod(), eftersom den ändras från protected till private. Detta innebär att klassen FirstSubClass har ett mer restriktivt beteende (tillhandahåller mindre service) än klassen BaseClass och kan därför inte vara en subklass till klassen BaseClass. b) Klassen SecondSubClass går att kompilera. Klassen SecondSubClass utökar synligheten av metoden amethod(), eftersom den ändras från protected till public. Detta innebär att klassen SecondSubClass tillhandahåller mer service än klassen BaseClass och är därför en korrekt subklass till klassen BaseClass. c) Klassen ThirdSubClass går att kompilera. I klassen BaseClass kastar metoden amethod() ett kontrollerande undantag vilket metoden inte gör i klassen ThirdSubClass. Detta innebär att metoden amethod() har ett starkare eftervillkor (tillhandahåller mer service) i klassen ThirdSubClass eftersom klienten inte behöver fånga ett undantaget när metoden anropas. Klassen ThirdSubClass är därför en korrekt subklass till klassen BaseClass.

Uppgift 6. a) b) public static <T> void copyelements(list<t> source, List<T> destination) { for (T k : source) destination.add(k); //copyelements public static <T> void copyelements(list<? extends T> source, List<? super T> destination) { for (T k : source) destination.add(k); //copyelements Signaturen kan även vara eller public static <T> void copyelements(list<? extends T> source, List<T> destination) public static <T> void copyelements(list<t> source, List<? super T> destination) Uppgift 7. public class NoRepeatDie implements Die { private Die die; public NoRepeatDie(Die die) { this.die = die; //constructor public void norepeatroll() { int v = die.getvalue(); do { die.roll(); while ( die.getvalue() == v ); //norepeatroll public void roll() { die.roll(); //roll public int getvalue() { return die.getvalue(); //getvalue //NoRepeatDie

Uppgift 8. I konstruktorn föreligger en risk. Eftersom objekt av klassen Date är muterbara, exponeras den inre representationen till klient-objektet som har access till de initiala start- och end-objekt. Det föreligger risk även i metoderna getstart() och getend(), eftersom klienten som anropar dessa erhåller en referens till start- respektive end-objekten. I konstruktorn är det enklaste sättet att åtgärda exponeringsriskerna genom att skapa och lagra kopior de objekt som fås som parametrar. I metoderna getstart() och getend() är det enklaste sättet att returnera kopior av respektive instansvariabel. Uppgift 9. import java.util.date; public class Interval { private final Date start; private final Date end; public Interval(Date start, Date end) { this.start = (Date) start.clone(); this.end = (Date) end.clone(); public Date getstart() { return (Date) this.start.clone(); public Date getend() { return (Date) this.end.clone(); //Interval import java.util.*; public class Grades { public Map<String, Set<Student>> grades; private double[] cutoffs; private static final String[] lettergrades = {"MVG", "VG", "G", "IG"; public Grades(double[] cutoffs) { grades = new HashMap<String, Set<Student>>(); this.cutoffs = cutoffs; for (String letter : lettergrades) grades.put(letter, new TreeSet<Student>()); //constructor public String findgrade(double score) { for (int i = 0; i < cutoffs.length; i++) if ( score >= cutoffs[i]) return lettergrades[i]; return "IG"; //findgrade public void add(student student, double score) { String grade = findgrade(score); Set<Student> setofstudents = grades.get(grade); setofstudents.add(student); //add public Set<Student> get(string grade) { return grades.get(grade); //get //Grades

Uppgift 10. Kontraktet som The Java Language Specification specificerar för equals och hashcode är: x.equals(y) x.hashcode() == y.hashcode() Detta betyder att kontraktet bryts om beräkningen av hashkoden involverar andra instansvariabler än de som används vid beräkningen av likhet. Exempelvis bryts kontrakt om equals variant 1 kombineras med hashcode variant 2, eftersom equals betraktar två objekt som lika om instansvariabeln stocknumber har samma värden i de båda objekten, medan beräkningen av hashkoden i hashcode också involverar instansvariabeln name. Samtliga instansvariabler som används vid beräkningen av likhet behöver inte ingå i beräkningen av hashkoden, eftersom två objekt med samma hashkod inte behöver vara lika. equals version 1 equals version 2 equals version 3 a) hashcode version 1 OK OK b) hashcode version 2 OK c) hashcode version 3 OK OK

Uppgift 11. a) import java.io.*; import java.util.*; public class Database extends Observable implements Runnable { private Thread t; private String resultfile; public Database(String resultfile) { this.resultfile = resultfile; t = new Thread(this); t.start(); //constructor @Override public void run() { while (! t.interrupted()) { try { t.sleep(5000); catch ( InterruptedException e ) { setchanged(); notifyobservers(gettable()); //run private String gettable() { //as before //gettable //Database b) import java.util.*; public class Display implements Observer { @Override public void update(observable obj,object o) { if (obj instanceof Database && o instanceof String ) { show((string) o); //update private void show(string result) { //code not shown here //show //Display //modifier changned to private c) public static void main(string[] args) { Database db = new Database(args[0]); Display dp = new Display(); db.addobserver(dp);... //main

Alternativ lösning som använder PropertyChangeSupport och PropertyChangeListener a) import java.io.*; import java.util.*; import java.beans.*; public class Database implements Runnable { private Thread t; private PropertyChangeSupport pcl; private String resultfile; public Database(String resultfile) { this.resultfile = resultfile; pcl = new PropertyChangeSupport(this); t = new Thread(this); t.start(); //constructor public void addlistener(propertychangelistener l) { pcl.addpropertychangelistener(l); //addlistener @Override public void run() { while (! t.interrupted()) { try { t.sleep(5000); catch ( InterruptedException e ) { firepropertychange("database", null, gettable()); //run private String gettable() { //as before //gettable //Database b) import java.beans.*; public class Display implements PropertyChangeListener { @Override public void propertychange(propertychangeevent e) { if (e.getsource() instanceof Database) { show((string) e.getnewvalue()); //update private void show(string result) { //code not shown here //show //Display //modifier changned to private c) public static void main(string[] args) { Database db = new Database(args[0]); Display dp = new Display(); db.addlistener (dp);... //main