Constructor Rückgabe Null

Anleitungen usw. rund um Java, Tutorials halt.

Moderator: wegus

Thomas67
Beiträge: 57
Registriert: 12.09.2010, 19:17

Constructor Rückgabe Null

Beitragvon Thomas67 » 27.02.2011, 21:18

Hallo

Ich will, daß der Constructor einer Class null zurückgibt, wenn im Constructor ungültige Werte übergeben werden

Beispiel
ich hab eine eigene Datumsklasse MyDate, die von Gregoriancalender abgeleitet ist, aber ( nach super() ) mit eigener StringToDate-Routine das Datum festlegt.
Sollte StringToDate fehlschlagen, weil der übergebene String nicht als Datum zu interpretieren ist, soll der MyDate - cosntructor null liefern


Wie schaff ich das, daß der Constructor null liefert? Return funktioniert nicht, this = null auch nicht

Könnts natürlich auch anders lösen, eigene valid-Variable innerhalb der Klasse, die dann abgefragt werden kann, aber das mag ich nicht.

Gruß
Thomas

Benutzeravatar
Baldur
Beiträge: 152
Registriert: 21.11.2008, 16:36

Re: Constructor Rückgabe Null

Beitragvon Baldur » 28.02.2011, 00:03

Ein Kunstruktor hat keinen Rückgabewert, weil ein Konstruktor nichts zurückgeben kann. Er soll nur das Objekt initalisieren, das zu dem Zeitpunkt, zu dem der Konstruktor läuft, bereits erzeugt wurde.

Für dein Problem gibt es zwei Lösungen:
  • Dein Kunstruktor kann eine Exception werfen (z.B. via "throw new IllegalArgumentException("Parameter 'time' ist ungültig");")
    Diese Exception muss der aufrufende Programmteil fangen und kann darauf reagieren.
  • Du benutzt statt eines Konstruktors eine Factory-Methode, die das Objekt erzeugt.

    Code: Alles auswählen

    class MyDate {
        private MyDate() {
            ...
        }

        public static MyDate create(...) {
            if (....) {
                return new MyDate();
            }

            return null;
        }
    }

    Die Factory-Methode "create" kann bei falschen Parametern also auch einfach null zurückgeben.
    Der eigentliche Konstruktor ist dabei private, d.h. er kann nur von den eigenen Methoden der Klasse aus aufgerufen werden und nicht aus anderen Programmteilen. Der Nachteil dabei ist, daß du dir damit bei Vererbung schwerer tust.

Für deine Klasse wäre sicher die erste Variante die geeigneteste, sprich einfach eine Exception zu werfen und das aufrufende Programm reagieren lassen.

Thomas67
Beiträge: 57
Registriert: 12.09.2010, 19:17

Re: Constructor Rückgabe Null

Beitragvon Thomas67 » 28.02.2011, 20:52

Danke

werde beides mal probieren
Factory Methoden hab ich bisher nicht benutzt
Wie initialisiere ich dann im Programm eine neue Instanz von myDate? auch einfach mit new oder ... ?

ebaumann
Beiträge: 284
Registriert: 22.01.2009, 08:53
Wohnort: Würzburg
Kontaktdaten:

Re: Constructor Rückgabe Null

Beitragvon ebaumann » 01.03.2011, 07:41

Thomas67 hat geschrieben:Factory Methoden hab ich bisher nicht benutzt
Wie initialisiere ich dann im Programm eine neue Instanz von myDate?


Factory-Methoden erhalten die erforderlichen Paramter, z.B.:

Code: Alles auswählen

public final class DateFactory {
   
    public static Date createDate(int day, int month, int year) {
        if (!isValidDate(day, month, year)) {
            throw new IllegalArgumentException("Invalid Date: " + day + "." + month + "." + year);
        }

        return new MyDate(day, month, year); // MyDate ist package private
    }

    private DateFactory() {} // Konstruktoraufruf verbieten
}


Nutzen:

Code: Alles auswählen

Date myBirthdaysDate = DateFactory.createDate(24, 12, 1999);


Ein Date zu implementieren, ergibt wenig Sinn, da es dies bereits doppelt im JDK gibt (java.util, java.sql). Factory-Methoden sind u.a. nützlich, (unterschiedliche) Implementierungen (MyDate) eines Interfaces (Date) zu liefern. So kann (später) die Implementierung ausgetauscht werden, ohne dass der Code an anderen Stellen angepasst werden muss.

Thomas67
Beiträge: 57
Registriert: 12.09.2010, 19:17

Re: Constructor Rückgabe Null

Beitragvon Thomas67 » 01.03.2011, 21:16

Danke Dir!


Zurück zu „Java - Tutorials“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast