Klasse mit extends Calendar über Methoden ändern (Hirnblockade)

torresbig

Mitglied
Hallo,

ich habe mir eine Klasse erstellt und dieser Klasse "Calendar" vererbt.
Dies hab ich gemacht, da in einem Managerspiel immer nachts um 3 Uhr die Transfers gemacht werden und alles was vor einer bestimmte Zeit ist, noch zu dem anderen Tag zählen soll. ist ja auch egal, aber hab ein Knoten im Kopf.

Java:
public class ComunioDate extends Calendar {

    private static final long serialVersionUID = 1L;
 
    public ComunioDate(){
        getInstance();
        setFirstDayOfWeek(MONDAY);
        add(Calendar.HOUR_OF_DAY, +10);  // das hier funktioniert! innerhalb der Klasse
    }
}

warum kann ich nicht einfach folgendes machen
Java:
ComunioDate yesterday = new ComunioDate();
yesterday.add(Calendar.DAY_OF_MONTH, -1));

oder

Java:
ComunioDate yesterday = new ComunioDate().add(Calendar.DAY_OF_MONTH, -1);

Ich habe hier einfach Verständnisschwierigkeiten. Bin kein gelernter Programmierer und bin deshalb für eine kleine Lehrstunde sehr sehr dankbar.

Hier nochmal zum Vergleich, wie es geht und wie nicht.
Java:
Calendar test =  Calendar.getInstance();
// das klappt!
test.add(Calendar.DAY_OF_MONTH, -1);

ComunioDate yesterday = new ComunioDate();
// geht nicht! WARUM?
yesterday.add(Calendar.DAY_OF_MONTH, -1);
 
Zuletzt bearbeitet:
Also wenn es sich um java.util.Calendar handelt, dann dürfte - dein Code unten, gar nicht kompilieren, da einige abstrakte Methoden nicht implementiert sind. Leider verschweigst du die Fehlermeldungen.
Wenn du von Calendar erben willst, dann solltest du von GregorianCalendar erben. Ich sehe aber keinen Sinn darin, zudem sollte man die java.time-API verwenden. Die java.util.* - Date- und Time- sind fast nur noch auch Kompatibilätsgründen vorhanden.
Java:
public class ComunioDate extends Calendar {

    private static final long serialVersionUID = 1L;
 
    public ComunioDate(){
        getInstance();
        setFirstDayOfWeek(MONDAY);
        add(Calendar.HOUR_OF_DAY, +10);  // das hier funktioniert! innerhalb der Klasse
    }
}
 
Also wenn es sich um java.util.Calendar handelt, dann dürfte - dein Code unten, gar nicht kompilieren, da einige abstrakte Methoden nicht implementiert sind. Leider verschweigst du die Fehlermeldungen.
Wenn du von Calendar erben willst, dann solltest du von GregorianCalendar erben. Ich sehe aber keinen Sinn darin, zudem sollte man die java.time-API verwenden. Die java.util.* - Date- und Time- sind fast nur noch auch Kompatibilätsgründen vorhanden.
Java:
public class ComunioDate extends Calendar {

    private static final long serialVersionUID = 1L;
 
    public ComunioDate(){
        getInstance();
        setFirstDayOfWeek(MONDAY);
        add(Calendar.HOUR_OF_DAY, +10);  // das hier funktioniert! innerhalb der Klasse
    }
}

ja, es ist der java.util.Calendar
Es kommt zu keiner Fehlermeldung. Er ändert einfach nur das Datum nicht.
mit GregorianCalendar ist es das selbe.
genau, bei java.util.Date hat man die Probleme, dass man nicht so komfortabel die Tage, Stunden... abziehen kann. Hier muss man ja immer in Millisekunden umrechen (was grundsätzlich ja kein Problem ist) und irgendwie wird überall dazu geraten java.util.Calendar statt Date zu verwenden. (wie du ja schreibst)

nochmal warum ich das mache. Wenn ich z.B. um 2 Uhr Nachts eine abfrage starte, soll er das Datum vom Vortag nehmen und die Zeit z.B. auf 10 Uhr setzen.

Aber jetzt mal egal ob sinnvoll oder nicht.
Warum klappt innerhalb der klasse das add(Calendar.HOUR_OF_DAY, +10 dass 10 stunden dazu gerechnet werden, aber wenn ich das auf die Klasse ComunioDate anwende geht es nicht.
Java:
Calendar test =  Calendar.getInstance();
// das klappt!
test.add(Calendar.DAY_OF_MONTH, -1);

ComunioDate yesterday = new ComunioDate();
// geht nicht! WARUM?
yesterday.add(Calendar.DAY_OF_MONTH, -1);
 
Wenn du von Calendar erbst, kann das ganze eh nicht funktionieren. Die Klasse ist abstrakt. Wenn musst du - wie schon geschrieben - von GregorianCalendar erben. Und da sollte das mit dem add funktionieren.

Bzgl. funktioniert nicht. Was funktioniert nicht? Bring am besten ein vollständiges Beispiel, mit dem was du erwartest und was stattdessen rauskommt.
 
hab doch das ganze beispiel gebracht 😀

Java:
Calendar test =  Calendar.getInstance();
test.add(Calendar.DAY_OF_MONTH, -1);
// das klappt! >> Datum: 30.09.2022
// hier ändert sich das Datum auf einen Tag vor heute (gestern)

ComunioDate yesterday = new ComunioDate();
yesterday.add(Calendar.DAY_OF_MONTH, -1);
// geht nicht! >> Datum: 01.10.2022
// hier ändert sich das Datum nicht auf einen Tag vor heute

und die Klasse ComunioDate sieht so aus (auch wenn ich GregorianCalendar nehme ist es das selbe!):
Java:
public class ComunioDate extends Calendar {

    private static final long serialVersionUID = 1L;
 
    public ComunioDate(){
        getInstance();
        setFirstDayOfWeek(MONDAY);
        add(Calendar.HOUR_OF_DAY, +10);  // das hier funktioniert! innerhalb der Klasse
    }
}
 
Wie Dir schon gesagt wurde: Die Klasse ComunioDate wird so nicht übersetzen, da diese nicht abstract ist und Du nicht alle abstract Methoden von Calendar implementiert hast.

Daher ist es egal, was Du sonst noch an Code schreibst: Da diese Klasse nicht übersetzt kann es auch zu keiner Ausführung und damit zu einem "nicht funktionieren" kommen.

Mögliche Alternativen sind auch schon genannt worden: Alle abstrakten Methoden implementieren oder eine Sub-Klasse verwenden, die dies schon gemacht hat.

Das einfach noch einmal in meinen eigenen Worten, was u.a. @LimDul schon gesagt hat.
 
Das kompiliert wir gesagt nicht, bring mal ein kompilierfähiges Beispiel inklusive der Ausgabe in der Konsole. Was rauskommt und was rauskommen soll.
 
Sorry Leute, ich war einfach nur doof. Es hatte sich ein ganz dummer Fehler eingeschlichen. Ich wollte die Uhrzeit immer bei nem neuem Datum auf eine bestimmte Zeit setzen und in meinem Beispiel hatte ich immer
Code:
set(HOUR_OF_DAY, +10);  // das Plus hat sich da eingeschlichen!
aber das ist natürlich falsch. Das Plus hat da nix zu suchen. so hat er immer 10 Stunden addiert, was nach 14 Uhr natürlich 1 Tag weiter ist und dann kommt das falsche Datum raus.

Es geht auch NUR mit dem GregorianCalendar! Denke ich hatte soviel rumversucht mit dem normalen Calendar, dass sich irgendwie das + dann eingeschlichen hatte und dann beim ersten Test mit GregorianCalendar auch der Fehler kam (aus den oben genannten Gründen):

So geht es jetzt:
Java:
public class TestComunioDate {

    public static void main(String[] args) {
        TestComunioDate tcd = new TestComunioDate();
        Calendar test =  Calendar.getInstance();
        test.add(Calendar.DAY_OF_MONTH, -1);
        System.out.println("Test Calendar: " + new SimpleDateFormat("dd.MM.yyyy - HH:mm").format(test.getTime()));
        // CONSOLE: Test ComunioDate1: 30.09.2022 - 23:50
       
        ComunioDate1 testCdate =  tcd.new ComunioDate1();
        testCdate.add(Calendar.DAY_OF_MONTH, -1);
        System.out.println("Test ComunioDate1: " + new SimpleDateFormat("dd.MM.yyyy - HH:mm").format(testCdate.getTime()));
        // CONSOLE: Test ComunioDate1: 30.09.2022 - 10:00
    }
    class ComunioDate1 extends GregorianCalendar {
        private static final long serialVersionUID = 1L;

        public ComunioDate1() {
            getInstance();
            setFirstDayOfWeek(MONDAY);
            set(HOUR_OF_DAY, 10);
        }
    }
}


Also wenn es sich um java.util.Calendar handelt, dann dürfte - dein Code unten, gar nicht kompilieren, da einige abstrakte Methoden nicht implementiert sind. Leider verschweigst du die Fehlermeldungen.
Wenn du von Calendar erben willst, dann solltest du von GregorianCalendar erben. Ich sehe aber keinen Sinn darin, zudem sollte man die java.time-API verwenden. Die java.util.* - Date- und Time- sind fast nur noch auch Kompatibilätsgründen vorhanden.
Java:
public class ComunioDate extends Calendar {

    private static final long serialVersionUID = 1L;
 
    public ComunioDate(){
        getInstance();
        setFirstDayOfWeek(MONDAY);
        add(Calendar.HOUR_OF_DAY, +10);  // das hier funktioniert! innerhalb der Klasse
    }
}
jetzt verstehe ich auch was du gemeinst hattest. die ganzen abstrakten Methoden hatte Eclipse unten hinzugefügt, aber waren von mir natürlich nicht "gefüllt". Mit GregorianCalendar und meinem + Fehler geht es

Danke an alle. Wieder ein wenig schlauer. DANKE!
 

Zurück
Oben