Ich muss in einem Projekt Datum- und Zeitwerte verwalten können (ein Datum und zwei Zeiten). Dabei ist jeweils nur das Datum (yyyy.MM.dd) bzw. nur die Zeit (hh:mm:ss) von Interesse. In einem ersten Anlauf habe ich dies mit GregorianCalendar gelöst. Da aber diese Klasse komplex (dadurch auch mächtig) ist, würde ich gerne eine eigene Klasse programmieren, die
- genau so mächtig wie GregorianCalendar ist, aber
- etwas einfacher in der Handhabung.
Ein möglicher Ansatz wäre eine Fasade um GregorianCalendar zu machen:
Mein Problem ist das, dass ich Instanzen dieser Klasse als XML übertragen muss (JAXB). Da ich eine Instanzvariable vom Typ GregorianCalendar habe, wird diese auch verpackt: für mich unnötig und aufwändig (viel Trafic). Die Lösung wäre vermutlich, selbst einen Marshaller zu schreiben ...
Aus diesem Grund habe ich einen anderen Ansatz gewählt:
Der Vorteil (aus meiner Sicht) sind:
- als Instanzvariable haben ich nur einfache Typen (int), womit das generierte XML einfach gehalten werden kann
- kein selbstgeschriebenes JAXB-Marschaller nötig
- kein umfangreiches GregorianCalendar-Objekt im XML
- die Überprüfung von Werten lasse ich von GregorianCalendar machen.
Das Date-Objekt verhält sich sonst ähnlich wie ein GregorianCalendar, hat jedoch eine einfachere Schnittstelle und sieht in der Tat wie ein Datum aus (keine Zeitangaben).
Ählich habe ich es auch für die Zeit gemacht: eine Klasse Time, die ähnlich wie Date aufgebaut ist.
Es würde mich interessieren, ob mein Vorgehen korrekt ist, oder ob ich den Rad neu erfinde? Bzw. hat es schon Konstrukte (Klassen), die diese Aufgabe schon erledigen? Und, habe ich da was übersehen bzw. wären noch Korrekturen / Anpassungen angebracht?
Danke.
- genau so mächtig wie GregorianCalendar ist, aber
- etwas einfacher in der Handhabung.
Ein möglicher Ansatz wäre eine Fasade um GregorianCalendar zu machen:
Java:
package my.package;
public class Date {
private GregorianCalendar gc = null;
public Date(){
gc = new GregorianCalendar();
}
public Date (int y, int m, int d){
this();
gc.set(Calendar.YEAR, y);
gc.set(Calendar.MONTH, m);
gc.set(Calendar.DAY_OF_MONTH, d);
}
public void setYear(int year){
gc.set(Calendar.YEAR, year);
}
public int getYear(){
return gc.get(Calendar.YEAR);
}
// ...
public long getAsTimeInMillis(){
return gc.getTimeInMillis();
}
}
Mein Problem ist das, dass ich Instanzen dieser Klasse als XML übertragen muss (JAXB). Da ich eine Instanzvariable vom Typ GregorianCalendar habe, wird diese auch verpackt: für mich unnötig und aufwändig (viel Trafic). Die Lösung wäre vermutlich, selbst einen Marshaller zu schreiben ...
Aus diesem Grund habe ich einen anderen Ansatz gewählt:
Java:
package my.project.domain;
import java.io.Serializable;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.xml.bind.annotation.XmlType;
@XmlType(propOrder = { "year", "month", "day" })
public class Date implements Serializable, Comparable<Date> {
private static final long serialVersionUID = 2516984451145418190L;
private int year;
private int month;
private int day;
public Date() {
GregorianCalendar gc = new GregorianCalendar();
year = gc.get(Calendar.YEAR);
month = gc.get(Calendar.MONTH) + 1;
day = gc.get(Calendar.DAY_OF_MONTH);
}
public Date(int year, int month, int day) {
GregorianCalendar gc = new GregorianCalendar(year, month - 1, day);
this.year = gc.get(Calendar.YEAR);
this.month = gc.get(Calendar.MONTH) + 1;
this.day = gc.get(Calendar.DAY_OF_MONTH);
}
public int getYear() {
return year;
}
public void setYear(int year) {
GregorianCalendar gc = new GregorianCalendar(this.year, this.month,
this.day);
gc.set(Calendar.YEAR, year);
this.year = gc.get(Calendar.YEAR);
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
GregorianCalendar gc = new GregorianCalendar(this.year, this.month - 1,
this.day);
gc.set(Calendar.MONTH, month);
this.month = gc.get(Calendar.MONTH) + 1;
}
public int getDay() {
return day;
}
public void setDay(int day) {
GregorianCalendar gc = new GregorianCalendar(this.year, this.month,
this.day);
gc.set(Calendar.DAY_OF_MONTH, day);
this.day = gc.get(Calendar.DAY_OF_MONTH);
}
@Override
public String toString() {
return year + "." + month + "." + day;
}
@Override
public int compareTo(Date param) {
if (this == param) {
return 0;
}
if (year == param.year) {
if (month == param.month) {
return day - param.day;
} else {
return month - param.month;
}
} else {
return year - param.year;
}
}
}
Der Vorteil (aus meiner Sicht) sind:
- als Instanzvariable haben ich nur einfache Typen (int), womit das generierte XML einfach gehalten werden kann
- kein selbstgeschriebenes JAXB-Marschaller nötig
- kein umfangreiches GregorianCalendar-Objekt im XML
- die Überprüfung von Werten lasse ich von GregorianCalendar machen.
Das Date-Objekt verhält sich sonst ähnlich wie ein GregorianCalendar, hat jedoch eine einfachere Schnittstelle und sieht in der Tat wie ein Datum aus (keine Zeitangaben).
Ählich habe ich es auch für die Zeit gemacht: eine Klasse Time, die ähnlich wie Date aufgebaut ist.
Es würde mich interessieren, ob mein Vorgehen korrekt ist, oder ob ich den Rad neu erfinde? Bzw. hat es schon Konstrukte (Klassen), die diese Aufgabe schon erledigen? Und, habe ich da was übersehen bzw. wären noch Korrekturen / Anpassungen angebracht?
Danke.
Zuletzt bearbeitet: