4 svar
368 visningar
TB16 behöver inte mer hjälp
TB16 182 – Fd. Medlem
Postad: 25 jun 2018 11:53

Översättning från UML till Java-kod

Uppgift:

Skriv Java-kod som definierar klasser och skapar objekt motsvarande UML-diagrammet

Min lösning:

Facit:

Fråga 1:

Jag undrar om facit verkligen stämmer? Klass B saknar ju en konstruktor och skapar en instans av C där instansvariablerna brukar deklareras. Bör man inte deklarera en referensvariabel av typ C i klass B först, och sedan skapa en instans i konstruktorn till B? 

Fråga 2:

De 3 sista raderna från facit skapas några instanser av A och B, men varför skapas inte en instans av C?

AlvinB 4014
Postad: 25 jun 2018 12:22

Fråga 1:

Det är ju i stort sett det man gör. Om du skapar ett fält och sedan ger detta fält ett värde kommer ju värdet sättas när instansen skapas (d.v.s. när en konstruktor skulle ha körts). När kompilatorn skapar bytekoden till detta skapar den en osynlig konstruktor där fältvärdena initieras. Detta kallas för en "förvald konstruktor" (default constructor) och är anledningen till att du kan använda new B() trots att du inte uttryckligen gjort en konstruktor som inte tar några parametrar i B.

Vad jag inte riktigt begriper med din kod är varför du tar en C-parameter i konstruktorn för B. Du skapar ju ändå en ny C-instans och ignorerar parametern. Om du tar bort C-parametern är din kod funktionsmässigt identisk till facits.

Fråga 2:

Därför att C-instanserna skapas i konstruktorn för B. Övriga instanser tas ju som parametrar till konstruktorerna och måste därför skapas separat.

TB16 182 – Fd. Medlem
Postad: 26 jun 2018 11:32
AlvinB skrev:

Fråga 1:

Det är ju i stort sett det man gör. Om du skapar ett fält och sedan ger detta fält ett värde kommer ju värdet sättas när instansen skapas (d.v.s. när en konstruktor skulle ha körts). När kompilatorn skapar bytekoden till detta skapar den en osynlig konstruktor där fältvärdena initieras. Detta kallas för en "förvald konstruktor" (default constructor) och är anledningen till att du kan använda new B() trots att du inte uttryckligen gjort en konstruktor som inte tar några parametrar i B.

Okej då förstår jag varför det inte finns en konstruktor i klass B. I ditt svar skrev du att om C-parametern tas bort så är min kod funktionsmässigt identisk, men finns det en speciell anledning varför inte B har en konstruktor om man bortser från anledningen att minimera antalet kodrader?  

Vad jag inte riktigt begriper med din kod är varför du tar en C-parameter i konstruktorn för B. Du skapar ju ändå en ny C-instans och ignorerar parametern. Om du tar bort C-parametern är din kod funktionsmässigt identisk till facits.

 

Jag blandar nog ihop aggregation med association. Ser nu att aggregation inte skall ha någon parameter i konstruktorn

Fråga 2:

Därför att C-instanserna skapas i konstruktorn för B. Övriga instanser tas ju som parametrar till konstruktorerna och måste därför skapas separat.

 Okej då förstår jag

AlvinB 4014
Postad: 26 jun 2018 11:44
TB16 skrev:
AlvinB skrev:

Fråga 1:

Det är ju i stort sett det man gör. Om du skapar ett fält och sedan ger detta fält ett värde kommer ju värdet sättas när instansen skapas (d.v.s. när en konstruktor skulle ha körts). När kompilatorn skapar bytekoden till detta skapar den en osynlig konstruktor där fältvärdena initieras. Detta kallas för en "förvald konstruktor" (default constructor) och är anledningen till att du kan använda new B() trots att du inte uttryckligen gjort en konstruktor som inte tar några parametrar i B.

Okej då förstår jag varför det inte finns en konstruktor i klass B. I ditt svar skrev du att om C-parametern tas bort så är min kod funktionsmässigt identisk, men finns det en speciell anledning varför inte B har en konstruktor om man bortser från anledningen att minimera antalet kodrader?  

 Eftersom de båda sätten åstadkommer samma sak så finns det egentligen inga anledningar (förutom estetiska) att föredra det ena eller andra sättet. Själv kan jag tycka att det är onödigt att hålla på att skapa en konstruktor om man lika gärna kan vara utan den, men om man vill göra kodens funktion extra tydligt går det väl an att initiera fältet i en konstruktor.

TB16 182 – Fd. Medlem
Postad: 26 jun 2018 11:58
AlvinB skrev:
TB16 skrev:
AlvinB skrev:

Fråga 1:

Det är ju i stort sett det man gör. Om du skapar ett fält och sedan ger detta fält ett värde kommer ju värdet sättas när instansen skapas (d.v.s. när en konstruktor skulle ha körts). När kompilatorn skapar bytekoden till detta skapar den en osynlig konstruktor där fältvärdena initieras. Detta kallas för en "förvald konstruktor" (default constructor) och är anledningen till att du kan använda new B() trots att du inte uttryckligen gjort en konstruktor som inte tar några parametrar i B.

Okej då förstår jag varför det inte finns en konstruktor i klass B. I ditt svar skrev du att om C-parametern tas bort så är min kod funktionsmässigt identisk, men finns det en speciell anledning varför inte B har en konstruktor om man bortser från anledningen att minimera antalet kodrader?  

 Eftersom de båda sätten åstadkommer samma sak så finns det egentligen inga anledningar (förutom estetiska) att föredra det ena eller andra sättet. Själv kan jag tycka att det är onödigt att hålla på att skapa en konstruktor om man lika gärna kan vara utan den, men om man vill göra kodens funktion extra tydligt går det väl an att initiera fältet i en konstruktor.

 Okej då hänger jag med. Stort tack för hjälpen

Svara
Close