1 // Datum.java
2 package vererbung;
3 import java.util.Calendar;
4
5 /** 6 * Datum ist ein Bauplan für Datumswerte. 7 * Beispielprogramm zur Programmiertechnik 1, Teil 5. 8 * Anders als in Teil 4 alle Instanzvariablen privat (Kapselung) und 9 * deshalb zusätzlich gleichnamige Instanzmethoden zur Wertabfrage. 10 * @author H.Drachenfels 11 * @version 19.2.2024 12 */
13 public final class Datum {
14 private final int tag;
15 private final int monat;
16 private final int jahr;
17
18 private Datum(int tag, int monat, int jahr) {
19 this.tag = tag;
20 this.monat = monat;
21 this.jahr = jahr;
22 }
23
24 /** 25 * Fabrikmethode, die ein value object mit dem angegebenen Datum liefert. 26 * @param tag ist der Tag im Monat 27 * @param monat ist der Monat im Jahr 28 * @param jahr ist das Jahr 29 * @return Referenz auf das value object 30 */
31 public static Datum valueOf(int tag, int monat, int jahr) {
32 // Datum pruefen (stark vereinfacht)
33 if (tag < 1 || tag > 31 || monat < 1 || monat > 12) {
34 throw new IllegalArgumentException("ungueltiges Datum");
35 }
36
37 // value object erzeugen
38 return new Datum(tag, monat, jahr);
39 }
40
41 /** 42 * Fabrikmethode, die ein value object mit dem aktuellen Datum liefert. 43 * @return Referenz auf das value object 44 */
45 public static Datum heute() {
46 // Systemkalender ablesen
47 Calendar c = Calendar.getInstance();
48
49 // value object erzeugen
50 return new Datum(c.get(Calendar.DAY_OF_MONTH),
51 c.get(Calendar.MONTH) + 1,
52 c.get(Calendar.YEAR));
53 }
54
55 /** 56 * Liefert den Tag im Monat. 57 * @return Tag im Monat als Zahl 1 bis 31 58 */
59 public int tag() {
60 return this.tag;
61 }
62
63 /** 64 * Liefert den Monat. 65 * @return Monat als Zahl 1 bis 12 66 */
67 public int monat() {
68 return this.monat;
69 }
70
71 /** 72 * Liefert das Jahr. 73 * @return Jahr 74 */
75 public int jahr() {
76 return this.jahr;
77 }
78
79 @Override
80 public String toString() {
81 return String.format("%d-%02d-%02d", this.jahr, this.monat, this.tag);
82 }
83
84 @Override
85 public boolean equals(Object o) {
86 if (o instanceof Datum) {
87 Datum that = (Datum) o;
88 return this.tag == that.tag
89 && this.monat == that.monat
90 && this.jahr == that.jahr;
91 }
92
93 return false;
94 }
95
96 @Override
97 public int hashCode() {
98 return (this.jahr << 9) + (this.monat << 5) + this.tag;
99 }
100 }
101