1)
A: Observer B: Template Method C: Proxy
D: Strategy E: Iterator
2) Man behöver en klass som är lyssnarklass. Den klassen ska implementera interfacet ActionListener som har en enda metod, actionPerformed. I den metoden definieras det som ska hända när man trycker på knappen.
class Listener implements ActionListener { public void actionPerformed (ActionEvent e) { System.out.println("Du tryckte på knappen"); } // Klassen kan ha annat innehåll också }Ett objekt av lyssnarklassen måste kopplas till knappen med hjälp av metoden addActionListener(). Så här kan det se ut:
button.addActionListner(theListener); Parametern theListener är (referens till) det aktuella lyssnarobjektet. Ovanstående, fast utan exakt rätta namn, räcker för att få 2p. Två specialfall: (1) theListener kan ersättas med this, om knappen skapas inuti den klass som utgör lyssnarklassen. (2) Man kan skapa lyssnarklassen och lyssnarobjektet på parameterplatsen. Lyssnarklassen blir då en anonym inre klass. Tentander som beskrivit endast ett specialfall fick också 2p. 3) UML-diagrammet finns i ett eget pdf-dokument.
4a) Decorator.
5a) Alla klasser ärver från klassen Object utan att man anger det explicit. Metoden equals() finns i Object och är public och ärvs således av alla klasser. 5c) Metoden equals() finns för att smidigt kunna ange egna villkor för att objekt är likadana inuti. Vi definierar om metoden enligt följande i klassen Car: public boolean equals(Object other) { if ( !(other instanceof Car)) return false; Car otherCar = (Car) other; return this.name.equals(otherCar.name) && this.year==otherCar.year; }Kommentarer: Parametertypen här måste vara Object eftersom metoden ärvs från klassen Object. Omkvalificering till Car behvövs innan man använder attribut från klassen Car. 6) Klassen A måste implementera interfacet Comparable eller ännu hellre Comparable<A>. Klassen måste ha en metod som anger ordningen mellan två A-objekt genom att returnera ett heltal som är negativt, noll (vid likhet) eller positivt. class A implements Comparable<A>{ public int compareTo(A other) { // returnerar heltal beroende på // ordningen mellan this och other } }7a) A går inte att kompilera. Metoden kräver ett objekt av RoundedShape. Då fungerar RoundedShape och dess subklasser. Dessa ÄR RoundedShape. Shape är superklass till RoundedShape och fungerar inte då den inte har alla egenskaper som RoundedShape har. 7b) Det som krävs här är en omkvalificering av referensen sc från nuvarande Shape till Circle. Det går bra eftersom sc refererar till ett Circle-objekt. Så här ska satsen se ut: Circle cc = (Circle) sc; 8) Rätta svar är B, D och E.
9) Polymorfism betyder mångformig. Det står i detta sammanhang för att
ett objekt av en viss typ (supertypen) kan representeras av flera olika subtyper. Supertypen är mångformig och subtyperna är de olika formerna. En abstrakt metod i supertypen ges olika definitioner i subtyperna. Anropet
10a) Syftet med Singleton är att säkerställa att det endast kan skapas ett enda objekt av klassen. public class Singleton { private static Singleton theOnly; private Singleton() {...} public static Singleton getInstance() { if (theOnly == null) theOnly = new Singleton(); return theOnly; } }10b) Referensen till det enda objektet måste vara static, annars skulle det krävas att man skapar ett objekt innan elementet används vilket kräver flera objekt. Det är orimligt och stämmer inte med Singleton. Måste också vara private för inte kunna tilldelas värde (null) utifrån och därigenom framtvinga att flera objekt skapas. Även final är bra vilket gör att den bara kan tilldelas värde en gång. 10c) Konstruktorn måste vara private, annars är det fritt fram att skapa många objekt. 10d) getInstance() måste vara static så att den kan anropas oberoende av objekt av Singleton. Annars krävs det ett Singleton-objekt innan man kan få tag på det enda Singleton-objektet vilket är orimligt. 10e) Med enum-typer i Java kan man enkelt göra Singleton och dess motsvarigheter som tillåter N st objekt.
11a) Objektet som refereras med cObject ska vara av typen Comparator. Comparator är ett interface med en enda metod compare(obj1,obj2), där två objekt jämförs och ett heltal returneras. Heltalet anger ordningen mellan elementen enligt samma princip som för metoden compareTo(obj) interfacet Comparable. class CompareA implements Comparator { public int compare(A obj1, A obj2) { // om obj1 och obj2 är lika så returneras 0 // om obj1 kommer före obj2 returneras heltal < 0 // om obj1 kommer efter obj2 returneras heltal > 0 } }11b) 1) Objekten i lista har redan en naturlig ordning genom implements Comparable och man vill sortera i en annan ordning. (2) Objekten i lista har ingen naturlig ordning och det är inte heller möjligt eller önskvärt att ge dem en sådan. 11c) Mönstret är Strategy
12)
På tentan krävdes endast förklaring av omöjliga scenarier, dvs bara alternativ C). För A) och B) krävdes bara svaren möjlig eller omöjlig. A) Möjlig: texten "3 running” kan skrivas ut två gånger efter varandra. Ett scenario kan vara detta: första gången skrivs texten ut av tråden a1 och omedelbart avbryts tråden och läggs i en pool för att fortsätta köra senare, sedan exekveras a1.run() vilket gör att ”3 running” skrivs ut en gång till eftersom att värdet av variabeln v har inte hunnit minska till 2. Sedan fortsätter exekveringen och v minskas till 0 och då avslutas exekvering avwhile-satsen i a1.run(), sedan fortsätter tråden sin exekvering vilket gör att v ändras till -1 och på samma sätt avslutas exekvering av while-satsen i tråden a1 och exekvering av tråden avslutas med. B) Möjlig: texten ”0 running” kan skrivas ut, ett scenario kan vara detta: Tråden börjar exekvera och skriver ut ”3 running”, ”2 running” och ”1 running” och omedelbart efter detta och innan värdet av variabeln v minskas till 0 avbryts tråden och läggs i poolen för att fortsätta köra senare. Sedan startar a1.run() exekvera så lång som exekvering av while-satsens villkor, men inte utsrift-satsen och då avbryts main-tråden för att fortsätta exekvera senare och tråden ska fortsätta sin exekvering. Tråden kommer att minska värdet av v till 0 och avslutas tråden där. Nu kommer main-tråden fortsätta sin exekvering och eftersom att v har blivit 0 så skrivs ut ”0 running” och därefter v minskas till -1 och avslutas main-tråden med. C) Inte möjlig: De två parallella exekveringarna använder samma variabel v. Värdet av v kan bara minskas eller vara samma i två följande utskrifter, men aldrig öka. |