Versions Compared

Key

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

...

Expand
titleDel 3 – Values-grensesnittet og ValueSeries-klassen (25%)
Oppgave a)

Values-grensesnittet utvider Iterable<Double>. Hvorfor er det nyttig/praktisk?

Expand
titleLF

Hvis en klasse implementerer Iterable så kan en bruke en instans av klassen på høyresiden av :-tegnet i en for-each-løkka, og iterere over alle verdier "inni" objektet. Her betyr det at vi kan skrive

for (double v : values) { ... }

 

Oppgave b)

Values-grensesnittet er ment å støtte observerbarhet og observert-observatør-teknikken, men deklarasjonen av metodene for lytterhåndtering er erstattet av ”…”. Skriv de to deklarasjonene.

Expand
titleLF
Code Block
themeEclipse
public void addValuesListener(ValuesListener listener);
public void removeValuesListener(ValuesListener listener); 
Oppgave c)

Skriv ferdig konstruktøren og de to appendValue-metodene i ValueSeries-klassen. Definer nødvendige felt.

Expand
titleLF
Code Block
private final Unit unit;
private Collection<Double> values  = new ArrayList<Double>();
public ValueSeries(Unit unit) {
	this.unit = unit;
}
public void appendValue(double value) {
	values.add(value);
	fireValuesChanged();
}
public void appendValue(Value value) {
	appendValue(value.getUnit().convert(value.getValue(), getUnit()));
}
Oppgave d)
Implementer metodene i ValueSeries-klassen, som er nødvendige for å gjøre klassen komplett.
Expand
titleLF
Code Block
themeEclipse
@Override
public int size() {
	return values.size();
}
@Override
public double average() {
	double sum = 0.0;
	for (double value : values) {
		sum += value;
	}
	return sum / values.size();
}
@Override
public Unit getUnit() {
	return unit;
}
@Override
public Iterator<Double> iterator() {
	return values.iterator();
}
//
@Override
public Values add(Values other) {
	Unit base = this.unit.findCommonBaseUnit(other.getUnit());
	ValueSeries result = new ValueSeries(base);
	Iterator<Double> otherDoubles = other.iterator();
	for (double value : values) {
		double otherDouble = otherDoubles.next();
		double sum = this.unit.convert(value, base) + other.getUnit().convert(otherDouble, base);
		result.appendValue(sum);
	}
	return result;
}
// ValuesListener support
private Collection<ValuesListener> listeners = new ArrayList<ValuesListener>();
@Override
public void addValuesListener(ValuesListener listener) {
	listeners.add(listener);
}
@Override
public void removeValuesListener(ValuesListener listener) {
	listeners.remove(listener);
}
protected void fireValuesChanged() {
	for (ValuesListener listener : listeners) {
		listener.valuesChanged(this);
	}
}

Lenke til løsningskode: ValueSeries.java (og testen: ValueSeriesTest.java)

 

...