Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleDel 1 – Unit-klassen (35%)
 Oppgave a)
Unit-klassen er utformet slik at instanser ikke skal kunne endres etter at de er opprettet. Hva er generelle fordeler og ulemper med klasser som gir ikke-modifiserbare (immutable) instanser?
Expand
titleLF

Klassen blir enklere, og minsker bl.a. behovet for validering. Instanser kan brukes av flere deler av et program, uten risiko for at en del endrer på dem og ødelegger for en annen del. Ulempen er at en må lage nye instanser hvis de må rettes på, istedenfor å endre dem direkte.

Oppgave b)
Skriv ferdig de tre konstruktørene og definer nødvendige felt. Hva er hensikten med bruken av throws-nøkkelordet, slik det er brukt her? Er det strengt tatt nødvendig og evt. hvorfor/hvorfor ikke?
Expand
titleLF


Code Block
private final String symbol;
public Unit(String symbol) throws IllegalArgumentException {
	this(symbol, null, 1.0, 0.0);
}
private final Unit base;
private final double factor, offset;
public Unit(String symbol, Unit base, double factor, double offset) throws IllegalArgumentException {
	for (int i = 0; i < symbol.length(); i++) {
		char c = symbol.charAt(i);
		if (! Character.isAlphabetic(c)) {
			throw new IllegalArgumentException(c + " is an illegal symbol character");
		}
	}
	this.symbol = symbol;
	this.base = base;
	this.factor = factor;
	this.offset = offset;
}
public Unit(String symbol, Unit base, double factor) throws IllegalArgumentException {
	this(symbol, base, factor, 0.0);
}

throws-deklarasjonen forteller leseren av koden at konstruktørene kan utløse unntak. Siden unntakene er en subklasse av RuntimeException og dermed ikke checked, så er det ikke nødvendige.

 

Oppgave c)
Hva er hensikten med å definere en toString()-metode?
Expand
titleLF

toString()-metoden brukes implisitt når Java lager String-objekter av instanser ifm. bruk av + og IO og sikrer at tilstanden til instanser blir presentert på en nyttig måte.

Se også toString()-metoden

Oppgave d)

Nederst i klassen defineres en del meter-relaterte Unit-instanser (m, km og dm og cm). Tegn objektdiagram som illustrerer objektstrukturen som disse instansene utgjør.

Expand
titleLF

Her er verdiene til feltene og kjeden av base-linker vesentlig.

PlantUML Macro
object "~#m : Unit" as m {
   symbol = "m"
   factor = 0.0
   offset = 0.0
}
object "~#km : Unit" as km {
   symbol = "km"
   factor = 1000.0
   offset = 0.0
}
km --> m: base
object "~#dm : Unit" as dm {
   symbol = "dm"
   factor = 0.1
   offset = 0.0
}
dm --> m: base
object "~#cm : Unit" as cm {
   symbol = "cm"
   factor = 0.1
   offset = 0.0
}
cm --> dm: base



Se også Objektdiagrammer

Oppgave e)
Metoden findCommonBaseUnit er sentral i konvertering av verdier mellom ulike enheter. Den skal virke slik at dm.findCommonBaseUnit(km) returnerer m-instansen. Skriv ferdig metoden.
Expand
titleLF


Code Block
themeEclipse
public Unit findCommonBaseUnit(Unit other) {
	Unit unit1 = this;
	while (unit1 != null) {
		Unit unit2 = other;
		while (unit2 != null) {
			if (unit2 == unit1) {
				return unit1;
			}
			unit2 = unit2.base;
		}
		unit1 = unit1.base;
	}
	return null;
}


Oppgave f)
convert-metoden er ferdigskrevet og bruker de to hjelpemetodene convertToBase og convertFromBase. De to hjelpemetodene kaller også seg selv. Forklar hvilke kall som gjøres til disse (inkludert de til seg selv) og hvilke argumenter de får og verdier de returnerer, i løpet av utførelsen av dm.convert(2.0, km).
Expand
titleLF
...
Oppgave g)
valueOf-metoden ”oversetter” fra et enhetssymbol til en Unit-instans, litt på samme måten som Double.valueOf lager en Double-verdi fra en String. Men merk at Unit.valueOf ikke skal lage nye instanser, men returnere en av de predefinerte! Skriv ferdig valueOf-metoden.
Expand
titleLF


Code Block
themeEclipse
public static Unit valueOf(String symbol) {
	for (Unit unit : ALL_UNITS) {
		if (symbol.equals(unit.symbol)) {
			return unit;
		}
	}
	return null;
}


Lenke til løsningskode: Unit.java (og testen: UnitTest.java)

 

...