Oppgave a)Values-grensesnittet utvider Iterable<Double>. Hvorfor er det nyttig/praktisk? Expand |
---|
| 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 |
---|
| Code Block |
---|
| 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 |
---|
| 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 |
---|
| Code Block |
---|
| @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) |