-
Notifications
You must be signed in to change notification settings - Fork 3
/
Cambi.java
90 lines (80 loc) · 3.19 KB
/
Cambi.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
/** Classe che rappresenta l'elenco dei tassi noti al cambiavalute. */
public class Cambi implements Iterable<Cambi.Tasso>{
/** Record che rappresenta una coppia di importi che descrivono un tasso di
* cambio. */
public record Tasso(Importo da, Importo a) {
/**
* Crea un nuovo tasso di cambio.
*
* @param da l'importo di partenza.
* @param a l'importo di arrivo
* @throws NullPointerException se uno dei due importi è <code>null</code>.
* @throws IllegalArgumentException se uno dei due importi non è positivo o
* se i due importi sono nella stessa valuta.
*/
public Tasso(Importo da, Importo a) {
if (!Objects.requireNonNull(da, "Il primo importo non può essere null.").isPositive()) throw new IllegalArgumentException("Il primo importo deve essere positivo.");
if (!Objects.requireNonNull(a, "Il secodo importo non può essere null.").isPositive()) throw new IllegalArgumentException("Il secondo importo deve essere positivo.");
if (a.valuta.equals(da.valuta)) throw new IllegalArgumentException("Impossibile definire un tasso di cambio tra valute identiche");
this.da = da;
this.a = a;
}
@Override
public String toString() {
return da + " = " + a;
}
}
/** L'elenco di cambi. Non deve essere o contenere <code>null</code> e non
* deve contenere più di un tasso tra due importi con una data coppia di
* valute. I tassi sono mantenuti in ordine di aggiunta/aggiornamento. */
private final List<Tasso> tassi = new LinkedList<>();
/** Cerca tra i tassi noti un tasso tra le valute date.
*
* @param da la valuta del primo importo.
* @param a la valuta del secondo importo.
* @return il tasso, oppure <code>null</code> se non è noto alcun tasso tra
* importi nelle valute date.
*/
public Tasso cerca(Valuta da, Valuta a) {
for (Tasso t : tassi)
if (t.da().valuta == da && t.a().valuta == a)
return t;
return null;
}
/**
* Aggiorna, o aggiunge, il tasso di cambio tra due valute all'elenco dei
* tassi noti.
*
* <p>Nel caso fosse noto un tasso tra le due stesse valute del tasso da aggioranre, questo
* sostituirà il precedente tasso; viceversa il tasso da aggiornare è di fatto "nouovo" e verrà
* semplicemente aggiunto alla lista dei tassi noti.
*
*
* @param tasso il tasso da aggiornare.
* @return <code>true</code> se il tasso sostituisce un tasso precedentemente noto,
* <code>false</code> viceversa.
*/
public boolean aggiorna(Tasso tasso) {
Tasso precedente = cerca(tasso.da().valuta, tasso.a().valuta);
if (precedente != null) tassi.remove(precedente);
tassi.add(tasso);
return precedente != null;
}
@Override
public Iterator<Tasso> iterator() {
return Collections.unmodifiableList(tassi).iterator();
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer("Tassi:\n");
Iterator<Tasso> it = tassi.iterator();
while (it.hasNext())
sb.append(it.next() + (it.hasNext() ? "\n" : ""));
return sb.toString();
}
}