Svar och lösningar till tentamen i DD1385 2018-01-10

1)    A: Template Method   B: Iterator   C: Observer    D: Proxy   E: Strategy

2a)   Förbättring av programkoden utan att programmets funktion eller gränssnitt ändras.

2b)   Alla programmets (eller programdelens) funktioner beskrivs i testfall. Testfall skrivs före koden. När testfallen uppfylls är programmet/programdelen klart.

3) Alla Java-klasser ärver klassen Object och ärver då alla metoder som definierats i Object, bl.a. metoden toString().

4)    CSC

5a)   Decorator   

5b)   Anrop av superklassens konstruktor   

5c)  Abstrakt klass: Inleds med abstract class . En abstrakt klass kan inte instansieras. Den innehåller nästan alltid någon abstrakt metod, dvs metod som endast har metodhuvud definierat. De abstrakta metoderna definieras fullständigt i subklasser.

5d) Klassen Colorable har ingen parameterlös konstruktor. Enda konstruktorn i Colorable måste ges en parameter av typ GeneralArtefact.
Liten "luring": Om ingen konstruktor alls definieras i en klass så finns det ändå en parameterlös konstruktor. Om man definierar en konstruktor med parameter så finns inte längre den parameterlösa konstrukorn. Om man vill ha den parameterlösa också så måste den definieras explicit.

6)   c går inte att kompilera. Det beror på att c är en instansvariabel. En instansvariabel existerar bara om man har skapat en instans av klassen, och ingen instans av Uppgift6 är skapad. a och b är klassvariabler och existerar oberoende av instanser.

7)   Klassen A måste implementera interfacet Comparable eller ännu hellre Comparable<A>. Klassen måste ha en metod (som man skriver själv) 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
        }
    }
  

8)   Rätta svar är A, 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 obj.m() där referensen obj är av supertypen, anropar olika metoder beroende på vilken typ av objekt som obj refererar till.
Dynamisk bindning = Först vid exekvering (dynamiskt) och inte vid kompilering bestäms vilken metod (vilken kod) som exekveras i anropet obj.m().

10)    Syftet är att säkerställa att det endast kan skapas ett enda objekt av klassen.

     public class Singleton {
         private static Singleton theElement; 
         private Singleton() {}
         public static Singleton theElement() {
             if (theElement == null) theElement = new Singleton();
             return theElement;
         }
     }
   
Variabeln theElement kan gärna göras final för att markera att den endast kan ges värde en gång. Elementet kan skapas på klassens första rad eller, som i lösningen ovan, skapas när det efterfrågas första gången. Konstruktorn är private vilket är en förutsättning för att det ska vara möjligt att ha full kontroll på antalet skapade objekt inifrån klassen.

11)   
A)  equals() är EJ static, anropas på en instans.
B)  sin() och cos() ÄR static. Finns ingen anledning att ha ett objekt av Math.
C)  parseInt() ÄR static vilket syns på anropet via klassnamnet Integer.

12)   Alternativ 1: Skriv en klass som ärver från Thread. Definiera trådens aktivitet i metoden run(). Skapa objekt av klassen och anropa metoden start().

      class MyThread extends Thread {
          public void run() { ... }
      }

      Mythread t = new MyThread();
      t.start();
      

Alternativ 2: Skriv en klass som implementerar interfacet Runnable. Definiera trådens aktivitet i interfacets metod run(). Skapa objekt ett av klassen Thread och ge Runnable-klassens objekt som parameter till konstruktorn. Anropa start() på objektet.

      class MyThread implements Runnable {
          public void run() { ... }
      }

      Thread t = new Thread(new MyThread());
      t.start();
      

13   Objekt ordnas i en trädstruktur. Det finns operationer som fungerar både på löv och sammansatta objekt. För UML, se t.ex. Composite-UML. Composite-klassen innehåller en lista där objekttypen är Component, dvs en Composite kan innehålla en blandning av Leaf och Composite.