Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Expand
titleDel 1 - Teori (20%)
Oppgave a)

Gitt følgende klasse:

Code Block
themeEclipse
languagejava
titleAccount
public class Account {
	private int balance = 0;


	public int getBalance() {
		return balance;
	}

	public void deposit(int amount){
		// ???
		balance += amount;
	}

	public void withdraw(int amount){
		// ???
		balance -= amount;
	}
}

I tillegg til koden er det spesifisert at deposit- og withdraw-metodene skal utløse unntak (og ikke endre objektet) dersom beløpet som gis som argument, er negativt.

Hva kalles det at metoder sjekker argumentene sine før de utfører evt. endringer på objektet? Fyll inn kode for // ??? i de to metodene, slik at oppførselen blir korrekt iht. kravet gitt over.

Expand
titleLF

Dette kalles validering (og er en viktig del av innkapsling). Det er lurt å skille ut valideringen i en egen metode som kalles fra endringsmetodene (her deposit og withdraw). Denne kan gjerne være protected, så subklasser kan redefinere og gjenbruke valideringslogikken. Det er vanligst å bruke en såkalt unchecked exception (usjekket unntak), som IllegalArgumentException.

Code Block
themeEclipse
languagejava
titleAccount LF
protected void checkAmount(int amount){
	if (amount < 0) {
		throw new IllegalArgumentException("Amount cannot be negative, but was " + amount);
	}
}

public void deposit(int amount){
	checkAmount(amount);
	balance += amount;
}

public void withdraw(int amount){
	checkAmount(amount);
	balance -= amount;
}
Oppgave b)

Tegn et objekttilstandsdiagram for et Account-objekt som viser hva som skjer når sekvensen deposit(100), getBalance(), withdraw(150) og withdraw(-50) utføres på objektet.

Expand
titleLF

Her er oppgaven dels å forstå koden, dels å kjenne diagram-notasjonen, spesielt at en transisjon (metodekall) leder tilbake til samme tilstand, dersom metodekallet ikke endrer objektet.

Oppgave c)

I koden over så initialiseres balance-feltet i deklarasjonen. Hva slags annen teknikk finnes for initialisering av et objekt og hvordan virker den? Hva er fordeler/ulemper med denne teknikken?

Expand
titleLF
En annen teknikk for initialisering er å bruke en eller flere konstruktører. Dette er metoder med samme navn som klassen som blir implisitt kalt ved bruk av new (med eller uten argumenter). Fordeler:
  • en kan skrive mer komplisert kode for initialisering, med f.eks. valg og validering

  • en kan (tvinges til å) oppgi argumenter som kan brukes i initialiseringen

  • konstruktører hjelper en å sikre tilstand ved bruk av innkapsling

Ulemper:

  • koden for initialisering blir ofte langt unna feltene den initialiserer

  • det er lett å glemme å initialisere felt

Oppgave d)

Gitt følgende kode for en Transaction-klasse, for å registrere data om én overføring mellom to konti:

Code Block
themeEclipse
languagejava
titleTransaction
public class Transaction {

	public final Account source;
	public final Account target;

	public final int amount;

	public final Date date = new Date();
}

Hva betyr nøkkelordet final her og hva mangler for å gjøre klassen korrekt gitt denne bruken av final? I hvilken grad støtter Transaction-klassen innkapsling?

Expand
titleLF

final betyr her at feltet ikke skal kunne endres etter at det er initialisert. Da må en enten initialisere i deklarasjonen eller i en eller flere konstruktører, eller en kombinasjon. Her er det naturlig å innføre en konstruktør som setter de tre feltene som ikke er initialisert i deklarasjonen:

 

Code Block
themeEclipse
languagejava
titleTransaction LF
public Transaction(Account source, Account target, int amount) {
 this.source = source;
 this.target = target;
 this.amount = amount;
}

Innkapsling handler om å 1) hindre at en kan sette objekter til en ulovlig tilstand og 2) skjule representasjonsdetaljer slik at en kan gjøre endringer uten at andre klasser også må endres. Her er innkapsling delvis støttet, siden det ikke er mulig å gjøre tilstanden gal. Imidlertid så skjules ikke hvordan data er representert, siden feltene er deklarert som public. 

...