1 // Datum.java
2 package equals.variante3;
3
4 /** 5 * Datum ist ein Bauplan für Datumsobjekte. 6 * Beispielprogramm zur Programmiertechnik 1, Teil 5. 7 * Als Oberklasse verwendbar (nicht nachahmenswert). 8 * @author H.Drachenfels 9 * @version 9.12.2019 10 */
11 public class Datum {
12 private final int tag;
13 private final int monat;
14 private final int jahr;
15
16 /** 17 * Fabrikmethode, die ein Objekt mit den angegebenen Werten liefert. 18 * @param tag ist der Tag im Monat als Zahl zwischen 1 und 31 19 * @param monat ist der Monat im Jahr als Zahl zwischen 1 und 12 20 * @param jahr ist das Jahr 21 * @return Referenz auf das Objekt 22 */
23 public static Datum valueOf(int tag, int monat, int jahr) {
24 return new Datum(tag, monat, jahr);
25 }
26
27 protected Datum(int tag, int monat, int jahr) {
28 // Datum pruefen
29 int maxTag;
30 switch (monat) {
31 case 2:
32 if (jahr % 4 == 0 && (jahr % 100 != 0 || jahr % 400 == 0)) {
33 maxTag = 29; // Schaltjahr
34 } else {
35 maxTag = 28; // kein Schaltjahr
36 }
37 break;
38 case 4:
39 case 6:
40 case 9:
41 case 11:
42 maxTag = 30;
43 break;
44 default:
45 maxTag = 31;
46 break;
47 }
48
49 if (tag < 1 || tag > maxTag || monat < 1 || monat > 12) {
50 throw new IllegalArgumentException("ungueltiges Datum");
51 }
52
53 this.tag = tag;
54 this.monat = monat;
55 this.jahr = jahr;
56 }
57
58 @Override
59 public String toString() {
60 return String.format("%04d-%02d-%02d", this.jahr, this.monat, this.tag);
61 }
62
63 @Override
64 public boolean equals(Object o) {
65 // Variante 1 und 2: if (o instanceof Datum) {
66 if (o != null && this.getClass() == o.getClass()) {
67 Datum that = (Datum) o;
68 return this.tag == that.tag
69 && this.monat == that.monat
70 && this.jahr == that.jahr;
71 }
72
73 return false;
74 }
75
76 @Override
77 public int hashCode() {
78 return (this.jahr << 9) + (this.monat << 5) + this.tag;
79 }
80 }
81