Calendar

Hallo Leute,

ich bin am verzweifeln 🤪

Für ein Projekt will ich ein Array aus Dates erstellen. Und das Array soll die letzten 30 Werktage enthalten.
Dafür experimentiere ich grade mit der Calendar-Klasse.

Wenn ich auf "DAY_OF_THE_WEEK direkt zugreife, bekomme ich den richtigen Wert (7 für Sonntag):

Java:
import java.util.Calendar;

public class Main {

    public static void main(String[] args) {
        Calendar meinKalender = Calendar.getInstance();
        System.out.println(meinKalender.DAY_OF_WEEK);
    }
}

Wenn ich per get()-Methode auf das Field zugreife bekomme ich den falschen Wert (1 für Montag):

Java:
import java.util.Calendar;

public class Main {

    public static void main(String[] args) {
        Calendar meinKalender = Calendar.getInstance();
        System.out.println(meinKalender.get(Calendar.DAY_OF_WEEK));
    }
}

Ich leider nix verstehen 😕
 
Also, hier liegen ein paar Missverständnisse vor.
Der Ausdruck, bzw. die Klassenkonstante:
Java:
Calendar.DAY_OF_WEEK
die du übrigens falsch über eine Instanz aufrufst (sollte dir jede IDE auch entsprechend anmeckern), ist einfach nur eine numerische Konstante, die für einen Nutzer der API keine weitere Bedeutung/Semantik hat. Es ist intern einfach nur als 7 definiert, und bedeutet nicht Sonntag, sondern einfach: 7
Hier hätte aus API-Designsicht sicherlich ein Enum besser funktioniert.
Der Ausdruck:
Java:
meinKalender.get(Calendar.DAY_OF_WEEK)
liefert 1, weil 1 als SUNDAY (und nicht Montag) definiert ist. Siehe Dokumentation: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Calendar.html#DAY_OF_WEEK
Siehe auch: https://stackoverflow.com/questions/10118225/check-if-day-of-week-is-between-monday-and-friday
 
wenn Calendar eine abstrakte Klasse ist, warum gibt es dann Konstruktoren
Auch abstrakte Klassen können Konstruktoren definieren, die aufgerufen werden, wenn man eine Instanz einer von dieser Klassen abgeleiteten Klasse erzeugt. Im Allgemeinen hat jede Klasse immer mindestens einen no-args Konstruktor, den man (wenn man ihn nicht explizit im Code definiert) auch "Default-Konstruktor" nennt. Generell muss jede Klasse in jedem ihrer Konstruktoren auch immer irgendeinen Superkonstruktor (also einen Konstruktor einer Oberklasse - im obersten Fall java.lang.Object) als erstes Statement aufrufen. Der Aufruf von no-args-Konstruktoren, also Konstruktoren ohne Parametern, geschieht implizit.
und wieso kann man eine Instanz davon erstellen?
Kann man doch gar nicht. Wieso glaubst du, dass man das kann?
 
Wenn du kannst, solltest du anstelle von Calendar besser LocalDate verwenden. Die Api von LocalDate ist um Längen besser als von Calender. Mit Calender hat man gefühlt zig Möglichkeiten sich in den Fuß zu schießen.

Ah ok. Muss ich mir mal anschauen.

Allerdings hab ich jetzt den Sinn dahinter verstanden, warum man eine Instanz einer abstrakten Klasse per Methode erstellen kann. Kann man ja gar nicht. Es wird eine Instanz von GregorianCalendar erstellt 😅 Aber mit Calendar wird ganz automatisch die Subklasse von Calendar gewählt, die für die eigenen "lokalen Bedingungen" passt.
 

Zurück
Oben