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

Relevanta dokument
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:

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

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

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

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

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

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

Instuderingsuppgifter läsvecka 2

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

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

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

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

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

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

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

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

Tentamen LÖSNINGSFÖRSLAG

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

Institutionen för TENTAMEN CTH HT-17 Datavetenskap TDA550

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 8: Exempel och problemlösning

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

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

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

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

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

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

DAT043 Objektorienterad Programmering

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

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

Instuderingsfrågor, del D

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

TENTAMEN OOP

TENTAMEN OOP

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

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

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

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Tentamen ID1004 Objektorienterad programmering May 29, 2012

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

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

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

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

Del A (obligatorisk för alla)

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

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

PROGRAMMERING-Java Omtentamina

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

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:

Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. Skriv ditt idnummer på varje blad (så att vi inte slarvar bort dem).

Tentamen. Lösningsförslag

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

LÖSNINGSFÖRSLAG

Tentamen LÖSNINGSFÖRSLAG

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

Tentamen FYTA11 Javaprogrammering

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

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

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

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

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

DAT043 - Föreläsning 7

Tentamen. Grundläggande programmering i Java A 5p, DTAA

PROGRAMMERING-Java TENTAMINA

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

Objektorienterad programutveckling, fk

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TENTAMEN. Objektorienterade applikationer CHALMERS. 2018/2019, lp 3 DAT055. Uno Holmer

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

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

Lösningsförslag: Övning 5.

Lösningsförslag till tentamen FYTA11 Javaprogrammering

OOP Tenta

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

Tentamen i Grundläggande programmering STS, åk 1 fredag

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.

Tentamen i Objektorienterad programmering

Tentamen LÖSNINGSFÖRSLAG

Objektorienterad programmering i Java

TENTAMEN OOP

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

LÖSNINGSFÖRSLAG TENTAMEN

Del A (obligatorisk för alla)

Uppgift: Algoritm för att beräkna kontrollsiffran i ett personnummer givet de 9 första siffrorna. Torrsimning av algoritm för personnummer

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

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

LULEÅ TEKNISKA UNIVERSITET

F4. programmeringsteknik och Matlab

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

Transkript:

Institutionen för TENTAMEN CTH VT-15 Datavetenskap 2015-08-19 TDA550 Tentamen för TDA550 Objektorienterad programvaruutveckling IT, fk DAG: 15-08-19 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 21/9 kl 12-13 och tisdag 22/9 kl 12-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 klasser och interface: public interface A { public void a(double x); //A public interface B { public void b(); //B public abstract class C implements A { public C() { System.out.println("constructor i C"); //constructor public void a(double x) { System.out.println("a() in C"); //a public abstract void c(); //C public class D extends C { public D() { System.out.println("constructor i D"); //constructor public void c() { System.out.println("c() in D"); //c //D public class E extends D implements B { public E() { System.out.println("constructor i E"); //constructor public void a(double i) { System.out.println("a() in E"); //a public void b() { System.out.println("b() in E"); //b //E public class F extends D { public F() { System.out.println("constructor i F"); //constructor public void a(int x) { System.out.println("a() in F"); //a //F a) Rita ett UML-diagram över klasserna och gränssnitten. (1 poäng) b) Vad blir resultatet för var och en av följande kodavsnitt (ger kompileringsfel, ger exekveringsfel, skriver ut xxx, etc)? i) A x = new C(); x.a(5); ii) A x = new E(); x.a(5); iii) A x = new F(); x.a(5); iv) B x = new E( ); D y = (D) x; y.c(); v) A x = new D( ); E y = (E) x; y.b(); vi) D x = new E( ); B y = (B) x; y.b(); Uppgift 2. (6 poäng) Ibland är det viktigt att en klass endast instansieras en gång under en programexekvering. Till exempel kan det i ett simuleringsprogram vara direkt olämpligt att flera slumptalsgeneratorer existerar samtidigt. Tillämpa designmönstret Singleton så att man kan hantera slumptal på följande sätt SingletonRandom r1 = SingletonRandom.getInstance(); SingletonRandom r2 = SingletonRandom.getInstance(); int s1 = r1.nextint(10); int s2 = r2.nextint(20);... Variablerna r1 och r2 skall förstås referera till ett och samma objekt, så alla anrop av nextint drar pseudoslumptal ur samma sekvens. Implementera SingletonRandom. Utnyttja klassen java.util.random. (5 poäng)

Uppgift 3. Betrakta nedanstående klasser: public class MusicPlayer { private Object o; private Volume vol = new Volume(); public MusicPlayer(Object o) { this.o = o; public void lower() { vol.lower(); public void higher() { vol.higher(); public void play() { if (o instanceof Trumpet){ ((Trumpet) o).playtrumpet(); else if (o instanceof Piano){ ((Piano) o).playpiano(); else if (o instanceof Guitar){ ((Guitar) o).playguitar(); public void changeinstrument(object ot) { this.o = o; //MusicPlayer public class Trumpet { public void playtrumpet() { //code for playing trumpet //constructors and methoder not shown here //Trumpet public class Piano { public void playpiano() { //code for playing piano //constructors and methoder not shown here //Piano public class Guitar { public void playguitar() { //code for playing guitar //constructors and methoder not shown here //Guitar Designen strider mot Open-Closed Principle. Åtgärds detta genom att nyttja designmönstret Strategy. (6 poäng)

Uppgift 4. a) Förklara vad det innebär att en typ Sub är en äkta subtyp till typen Sup. (2 poäng) b) Betrakta specifikationen för de två interfacen nedan: // A list of ints where each int is at a position where the first // position is 0, second position is 1, etc. interface IntList { @requires receiver has >= i elements @effects puts x at position i, moving all elements at positions >= i one position higher @modifies this void insertat(int x, int i); @effects puts x at some unspecified position i, moving all elements at positions >= i one position higher @modifies this void insert(int x); @requires receiver has > i elements @returns the int currently at position i int get(int i); // A sorted list of ints where each int is at a position where the first // position is 0, second position is 1, etc. Ints are in increasing order. interface SortedIntList { @requires receiver has >= i elements and the effect of the operationcmaintains a sorted list (i.e., i is a "legal" position to add x) @effects puts x at position i, moving all elements at positions >= i one position higher. @modifies this void insertat(int x, int i); @effects puts x at some position i that maintains sorted order (moving all elements previously at position i or greater to one position higher). @modifies this void insert(int x); @requires receiver has > i elements. @returns the int currently at position i. int get(int i); i) Är SortedIntList en äkta subtyp till IntList? Motivera ditt svar! (2 poäng) ii) Är IntList en äkta subtyp til SortedIntList? Motivera ditt svar! (2 poäng)

Uppgift 5. Vid användning av designmönstret Observer kan man ha både flera observerade objekt och flera observatörer. En observatör kan t.ex. observera två olika objekt. Antag att vi har klasserna public class FirstClass extends Observable {... public class SecondClass extends Observable {... Antag att både FirstClass och SecondClass kan anropa notifyobservers med en sträng eller ett heltal som argument. Nedan ges ett kodskelett för klassen Monitor: import java.util.observer; import java.util.observable; public class Monitor implements Observer { public Monitor(FirstClass a, SecondClass b) { a.addobserver(this); b.addobserver(this); public void update(observable o, Object arg) { //uttgift att färdigställa Din uppgift är att implementera metoden update i klassen Monitor. Metoden update skall fungera enligt följande: Om anropet orsakades av att FirstClass anropade notifyobservers med en sträng som argument så skall strängen översättas till stora bokstäver och skrivas ut. Om istället anropet orsakades av att SecondClass anropade notifyobservers med ett heltal som argument så skall talet multiplicerat med 10 skrivas ut. Annars görs ingenting. Anm: FirstClass- och SecondClass-objekten kan inte nås via instansvariabler. (4 poäng) Uppgift 6. Följande interface och klass är givna: public interface Sorter { public void sort(int[] numbers); import java.awt.list; public class NumberSorter { public void sort(list<integer> numbers) { Collections.sort(numbers); Skriv en klass SortListAdapter som implementerar desigmönstret Adapter för att anpassa gränssnittet för typen NumberSorter till typen Sorter. (5 poäng) Uppgift 7. Betrakta nedanstående kod: public interface SomeInterface { void somemethod(); //SomeInterface public class SomeClass implements SomeInterface { void somemethod() { //some code //SomeClass Förklara varför klassen SomeClass inte går att kompilera. (2 poäng)

Uppgift 8. Betrakta nedanstående deklarationer: List<Object> listobject; List<Number> listnumber; List<? extends Number> listextendsnumber; List<? super Number> listsupernumber; List<Double> listdouble; List<? extends Double> listextendsdouble; List<? super Double> listsuperdouble; Number n; Double d; Integer i; Ange för var och en av följande satser om satsen är korrekt eller ger kompileringsfel: Uppgift 9. a) listnumber.add(d); b) listextendsnumber.add(n); c) listsupernumber.add(i); d) i = listextendsnumber.get(0); e) n = listextendsnumber.get(0); f) n = listsupernumber.get(0); g) listnumber = listdouble; h) listextendsnumber = listdouble; i) listextendsnumber = listextendsdouble; j) listsuperdouble = listobject; Betrakta nedanstående interface och klasser: public interface Airplane { public void construct(); //Airplane public class OriginalAirplane implements Airplane { @Override public void construct() { System.out.print("Original Airplane. "); //OriginalAirplane (5 poäng) Använd designmönstret Decorator för att skapa två nya klasser EjectionSeatDecorator och TurboDecorator som dekorerar objekt av klassen Airplane med en katapultstol respektive en turbomotor. Nedanstående main-metod illustrerar hur det hela är tänkt att fungera: Tips: public static void main(string[] args) { Airplane planea = new OriginalAirplane(); planea.construct(); System.out.println(); Airplane planeb = new EjectionSeatDecorator(new OriginalAirplane()); planeb.construct(); System.out.println(); Airplane planec = new EjectionSeatDecorator(new TurboDecorator (new OriginalAirplane())); planec.construct(); System.out.println(); //main Utskriften från main-metoden skall bli: Double Object Number Original Airplane. Original Airplane. Inserting Ejection Seat to airplane. Original Airplane. Inserting Turbo to airplane. Inserting Ejection Seat to airplane. Integer För att undvika duplicering av kod skall du skapa en abstrakt klass AirplaneDecorator som klasserna EjectionSeatDecorator och TurboDecorator ärver från. (6 poäng)

Uppgift 10. a) Betrakta nedanstående klasser: public class Print implements Runnable { private String str; public Print(String s) { str = s; public void run(){ System.out.println(str + ". "); //Print import java.util.*; public class PrintTest { public static void main(string[] args) { Thread t1 = new Thread(new Print("Thread1")); Thread t2 = new Thread(new Print("Thread2")); Thread t3 = new Thread(new Print("Thread3")); t3.start(); t2.start(); t1.start(); //PrintTest Vilka möjliga utskrifter kan erhållas då main-metoden i klassen PrintTest exekveras? (3 poäng) b. Betrakta klassen WaterTank, nedan, som används för att handha en vattentank: public class WaterTank { private double level; public void fill(double volume) { level = level + volume; public boolean empty(double volume) { if (volume < level) { double newlevel = level - volume; level = newlevel; return true; else return false; //WaterTank i) Klassen är inte trådsäker. Förklara med ett exempel varför! (2 poäng) ii) Skriv om klassen så att den blir trådsäker! (2 poäng)

Uppgift 11. Nedan finns ett skelett till klassen AppStore, som skall används för att hålla reda på vilka appar som finns tillgängliga för olika operativsystem: public class AppStore { private Map<String, Set<String>> store; public AppStore() { //skall implementeras i deluppgift a) public void addapp(string ostype, String appname) { //skall implementeras i deluppgift b) public String getostypewithmaxnumapps() { //skall implementeras i deluppgift c) //AppStore Din uppgift är att färdigställa klassen. a) Implementera konstruktorn, som skapar en tom Map. (1 poäng) b) Implementera metoden addapp, vilken lägger till appen appname till operativsystemet ostype. (3 poäng) c) Implementera metoden getostypewithmaxnumapps, vilken returnerar det operativsystem som har flest appar tillgängliga. Du får anta att inga operativsystem har samma antal applikationer. (3 poäng)

Uppgift 1. Tentamen 150819 - LÖSNINGSFÖRSLAG a) <<interface>> A a(double): void {abstract C a(double): void c(): void D c(): void <<interface>> B b(): void E a(double): void b(): void F a(int): void b) i) Tilldelningen A x = new C() ger kompileringsfel eftersom klassen C är abstrakt. ii) Ger utskriften: constructor i C constructor i D constructor i E a() in E iii) Ger utskriften: constructor i C constructor i D constructor i F a() in C iv) Ger utskriften: constructor i C constructor i D constructor i E c() in D v) Ger utskriften: constructor i C constructor i D sedan inträffar ett exekveringsfel pga att den dynamiska typen på x är D och typen D kan inte typomvandlas till typen E. iv) Ger utskriften constructor i C constructor i D constructor i E c() in E

Uppgift 2. public class SingletonRandom { private static SingletonRandom instance = null; private Random random; private SingletonRandom() { random = new Random(); //constructor public static synchronized SingletonRandom getinstance() { if (instance == null) instance = new SingletonRandom(); return instance; //getinstance public int nextint(int limit) { return random.nextint(limit); //nextint //SingeltonRandom

Uppgift 3. public class MusicPlayer { private Instrument instrument; private Volym vol = new Volym(); public Musicplayer(Instrument instrument) { this.instrument = instrument; public void lower() { vol.lower(); public void higher() { vol.higher(); public void play() { instrument.play(); public void changeinstrument(instrument theinstrument) { instrument = theinstrument; // MusicPlayer public interface Instrument { public abstract void play(); //Instrument public class Trumpet implements Instrument { public void play() { //code for playing trumpet //constructors and methoder not shown here //Trumpet public class Piano implemens Instrument { public void play() { //code for playing piano //constructors and methoder not shown here //Piano public class Guitar implements Instrument { public void play() { //code for playing guitar //constructors and methoder not shown here //Guitar

Uppgift 4. a) Begreppet äkta subtyp definieras av Liskov Substitution Principle. Att Sub är en äkta subtyp till Sup innebär att man i ett program kan byta ut ett objekt av klassen Sup mot ett objekt av typen Sub utan att beteendet hos programmet förändras. Detta innebär att en äkta subtyp inte kan ha en svagare specifikation. Förlitar sig en klient på supertypens specifikation och subtypen har en svagare specifikation kommer det att gå galet. b) Uppgift 5. Uppgift 6. Uppgift 7. i) Nej! Specifikationen för metoden insertat i klassen SortedIntList är svagare än i klassen IntList. Detta pga att förvillkoret är starkare. Förvillkoret kräver att klienten väljer ett värde på parametern i som bevarar den sorterade ordningen i listan. ii) Nej! Specifikationen för metoden insert i klassen IntList är svagare än i klassen SortedIntList. Detta pga att eftervillkoret är svagare, då det inte finns några garantier på var det insatta element hamnar i listan. public void update(observable o,object arg) { if (o instanceof FirstClass && arg instanceof String) { String s = (String) arg; System.out.println(s.toUpperCase()); if (o instanceof SecondClass && arg instanceof Integer) { Integer i = (Integer) arg; System.out.println(i*10); //update import java.awt.list; public class SortListAdapter implements Sorter { private NumberSorter sorter = new NumberSorter(); @Override public void sort(int[] numbers) { List<Integer> numberlist = new ArrayList<Integer>(); for (int i = 0; i < numbers.length; i++) numberlist.add(numbers[i]); sorter.sort(numberlist); for (int i = 0; i < numbers.length; i++) numbers[i] = numberlist.get(i); //SortListAdapter Metoderna i ett interface är alltid publika och abstrakta, oberoende av om detta anges eller inte. Deklarationen av vårt interface ser alltså egentligen ut enligt: public interface SomeInterface { public abstract void somemethod(); En klass som implementerar interfacet kan inte begränsa synligheten av metoderna som definieras av interfacet, vilket klassen SomeClass gör. En korrekt implementation av klassen är: public class SomeClass implements SomeInterface { public void somemethod() { //some code

Uppgift 8. a) Korrekt. I en list av typen List<Number> kan ett element av typen Double läggas in eftersom Double är en suptyp till Number. b) Kompileringsfel. List<? extends Number> kan antingen vara List<Number>, List<Double> eller List<Integer>. Kompilatorn vet inte vilken den specifika är och i typen List<Double> eller List<Integer> kan man inte lägga in ett objekt av typen Number. c) Korrekt. List<? super Number> kan antingen vara List<Number> eller List<Object> och Integer är subtyp både till Number och Object. d) Kompileringsfel. Typen List<? extends Number> inkluderar typerna List<Number> samt List<Double>, och varken Number eller Double är subtyper med typen Integer. e) Korrekt. I alla listor av typen List<? extends Number> ( List<Number>, List<Double> eller List<Integer>) är objekten kompatibla med typen Number. f) Kompileringsfel. List<? super Number> kan antingen vara List<Number> eller List<Object>. Kompilatorn vet inte vilken den specifika är och i typen List<Object> är inte elementen kompatibla med typen Number. g) Kompileringsfel. List<Double> är inte en subtyp till List<Number>, utan en subtyp till Collection<Double>. h) Korrekt. List<? extends Number> kan antingen vara List<Number>, List<Double> eller List<Integer>, samt List<SomeType> där SomeType är en subtyp till någon av typerna Double eller Integer.. i) Korrekt. Se deluppgift h). j) Korrek. List<? extends Double> kan antingen vara List<Double>, List<Number> eller List<Object>. Uppgift 9. public abstract class AirplaneDecorator implements Airplane { protected Airplane decoratedairplane; public AirplaneDecorator(Airplane decoratedairplane) { this.decoratedairplane = decoratedairplane; public void construct() { decoratedairplane.construct(); //AirplaneDecorator public class EjectionSeatDecorator extends AirplaneDecorator { public EjectionSeatDecorator(Airplane decoratedairplane) { super(decoratedairplane); @Override public void construct() { decoratedairplane.construct(); System.out.print(" Inserting Ejection Seat to airplane. "); //EjectionSeatDecorator /public class TurboDecorator extends AirplaneDecorator { public TurboDecorator(Airplane decoratedairplane) { super(decoratedairplane); @Override public void construct() { decoratedairplane.construct(); System.out.print(" Inserting Turbo to airplane. "); //TurboDecorator

Uppgift 10. a) 6 olika utskrifer är möjliga, nämligen alla permutationer av strängarna "Thread1", "Thread2" och "Thread3", dvs b) Thread1. Thread2. Thread3. Thread1. Thread3. Thread2. Thread2. Thread1. Thread3. Thread2. Thread3. Thread1. Thread3. Thread1. Thread2. Thread3. Thread2. Thread1. i) Det kan uppstå ett s.k. race condition, eftersom t.ex. en tråd T1 kan anropa metoden empty() samtidigt som en annan tråd T2 anropar metoden fill(). Trådarna konkurrerar då om variabeln level. Anta att level har värdet 100.0. Följande kan då inträffa: T1 vill tömma ur volymen 50. Eftersom level har värdet 100 går detta bra och T1 påbörjar beräkningen av satsen double newlevel = level - volume; Under vill T2 fylla tanken med volymen 100. T2 hinner utföra satsen level = level + volume; innan T1 är klar med sina beräkning. level kommer således att få värdet 150. När sedan T1 blir klar med sin beräkning har newlevel värdet 50. T1 utför sedan satsen level = newlevel; och level får värdet 50. Men ett korrekt värde borde varit 100. Ett inkonsistent tillstånd har inträffat. ii) public class WaterTank { private double level; public synchronized void fill(double volume) { level = level + volume; public synchronized boolean empty(double volume) { if (volume < level) { double newlevel = level - volume; level = newlevel; return true; else return false; //WaterTank

Uppgift 11. a) b) c) public AppStore() { store = new HashMap<String, Set<String>>(); public void addapp(string ostype, String appname) { Set<String> ostypeapps = store.get(ostype); if (ostypeapps == null) { ostypeapps = new TreeSet<String>(); store.put(ostype, ostypeapps); ostypeapps.add(appname); public String getostypewithmaxnumapps() { int max = -1, numapps; String ostypemaxapp = null; for (String ostype : store.keyset()) { numapps = store.get(ostype).size(); if (numapps > max) { max = numapps; ostypemaxapp = ostype; return ostypemaxapp;