Objekte erzeugen Httprequest oder Httpclient

Wave

Mitglied
In Java sind die Klassen Httprequest oder Httpclient als abstrakt definiert.
In der Schule haben wir nun gelernt dass von abstrakten Klassen keine Objekte erzeugt werden können.
In der Doku steht bei Httprequest oder Httpclient dennoch ein Konstruktor oder eine "Builder" Methode. Mit der Builder-Methode (z. B. newBuilder(uri:Uri) bei Httprequest) kann man doch Objekte erzeugen? Habe ich das richtig verstanden? Sorgt ein Builder dafür, dass man dennoch in einer abstrakten Klasse ein Objekt erzeugen kann?
WIr haben auch die Schnittstellen Httprequest.Builder und Httprespons<String> verwendet.
Wir machen gerade Client-Server-Prinzip.
 
In der Doku steht bei Httprequest oder Httpclient dennoch ein Konstruktor oder eine "Builder" Methode. Mit der Builder-Methode (z. B. newBuilder(uri:Uri) bei Httprequest) kann man doch Objekte erzeugen?
Ja.

Habe ich das richtig verstanden?
Ja.

Sorgt ein Builder dafür, dass man dennoch in einer abstrakten Klasse ein Objekt erzeugen kann?
Nein, du bekommst eine konkrete Implementierung/Erweiterung der abstrakten Klasse. Die tatsaechliche Klasse der Instanz welche du da bekommst geht dich aber nichts an. Zum Beispiel:

Java:
public static final AbstractSomething newInstance() {
    return new ConcreteClassExtendingAbstractSomething();
}

Es geht darum dass du von der konkreten Klasse entkoppelt bist, weil dann kann der Builder naemlich auch in der naechsten Version eine andere konkrete Klasse retournieren und dein Code und Program funktioniert weiterhin. Siehe Fabrikmethoden.

Oder in bekannten Klassen:

Java:
public static final List createNewList() {
    return new ArrayList<>();
}
 
Also erst einmal zum Verständnis: Natürlich kann auch eine abstrakte Klasse einen Konstruktor haben. Eine abstrakte Klasse kann ja Dinge enthalten, die initialisiert werden müssen und dazu dient u.a. ein Konstruktor.

Und ja - du kannst von einer abstrakten Klasse keine neue Instanz anlegen. Du brauchst eine neue Klasse, die von der abstrakten Klasse erbt und die dann alle abstrakten Elemente implementiert.

Wenn Du nun einen Builder hast, dann gilt das natürlich auch für diesen. Das kann man auch an den Sourcen sehr gut nachvollziehen. Schauen wir erst einmal HttpRequest.java an:

Da siehst Du dann, dass bei newBuilder die Klasse jdk.internal.net.http.HttpRequestBuilderImpl verwendet wird.

Und diesen Builder kann man sich dann auch einmal ansehen:

Und da die Methode build() ja den HttpRequest zurück gibt, nehmen wir direkt diese Methode:
Java:
    @Override
    public HttpRequest build() {
        if (uri == null)
            throw new IllegalStateException("uri is null");
        assert method != null;
        return new ImmutableHttpRequest(this);
    }

Somit gibt es eine Klasse ImmutableHttpRequest, die von HttpRequest erben muss (sonst wäre die Rückgabe nicht erlaubt).


Falls dieses "in den Sourcen nachsehen" für Dich noch zu viel ist, dann kannst Du das prinzipiell auch selbst prüfen. Dazu schreibst Du einfach etwas Code, das einen HttpRequest erzeugt. Und dann kannst Du Dir am Ende die Details des HttpRequests anzeigen lassen. Das wäre dann etwas wie:
Java:
        HttpRequest request = HttpRequest.newBuilder()
                .GET()
                .uri(new URI("https://localhost:8080"))
                .build();
        System.out.println(request.getClass().getName());

Das gibt Dir dann auch aus, was für eine Klasse es ist und hier ist es dann - wie erwartet - jdk.internal.net.http.ImmutableHttpRequest

Natürlich kann man auch noch weitere Dinge prüfen, z.B. die Superklasse. Was Du alles aus einer Klasse auslesen kannst, findest Du in der Beschreibung der Klasse Class.:
System.out.println(request.getClass().getSuperclass().getName());
Und da kommt dann - wieder wie erwartet - heraus: java.net.http.HttpRequest
 
In Java sind die Klassen Httprequest oder Httpclient als abstrakt definiert.
In der Schule haben wir nun gelernt dass von abstrakten Klassen keine Objekte erzeugt werden können.
In der Doku steht bei Httprequest oder Httpclient dennoch ein Konstruktor oder eine "Builder" Methode. Mit der Builder-Methode (z. B. newBuilder(uri:Uri) bei Httprequest) kann man doch Objekte erzeugen? Habe ich das richtig verstanden? Sorgt ein Builder dafür, dass man dennoch in einer abstrakten Klasse ein Objekt erzeugen kann?
WIr haben auch die Schnittstellen Httprequest.Builder und Httprespons<String> verwendet.
Wir machen gerade Client-Server-Prinzip.
Abstrakte Klassen kannst du nicht erzeugen, aber du kannst eine von einer abstrakten Klasse abgeleiteten Klasse erzeugen.

Anonyme Klassen (Klassen ohne Namen) sind auch eine abgeleitete Klasse , deshalb geht zum Beispiel:

Java:
TableModel m = new AbstractTableModel() {
    //hier die weitere Implementierung ... der abtrakten Methoden
};

auch.
 

Neue Themen


Zurück
Oben