Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen?

_user_q

Aktives Mitglied
Zurzeit rufe ich eine Funktion mit
Java:
new Load().values();
auf, aber values() ist static, weshalb auch der obige Code von IntelliJ Gelb markiert wird. Ich kann aber nicht einfach
Java:
Load.values();
schreiben, da sonst der Constructor nicht mit aufgerufen wird und in diesem Constructor werden wichtige Elemente zu einer ArrayList hinzugefügt. Jedoch sehe ich es auch als unnötig, immer die Elemente zu einer ArrayList hinzuzufügen, wenn new Load.values() aufgerufen wird, denn das Hinzufügen zur ArrayList muss ja nur einmal geschehen.
Meine Frage: Wie kann ich die Funktion values() mit dem Constructor aufrufen?
Würde ich nicht damit außerdem jedes Mal ein neues Objekt erstellen?:
Java:
Load load = new Load();
load.values(); // Wird Gelb markiert, weil er auf values über die Referenz "Load"(.values()) zugreifen möchte
 

KonradN

Super-Moderator
Mitarbeiter
Kannst Du das einmal konkret zeigen? Was genau versuchst Du da? Das hört sich erst einmal sehr dubios an, als ob Du da etwas mischst, das so keinen Sinn macht.

Wenn in der static Methode values() irgendwas initialisiert sein muss, dann kannst Du das ggf. im Aufruf machen so es noch nicht erfolgt ist. Also wie bei dem Singleton Pattern.

Oder Du hast in values etwas, das halt eine Instanz benötigt und die Frage, die dann sofort im Raum steht: Wieso ist es dann static?

Generell solltest Du objektorientiert arbeiten und static bricht dies in der Regel. Die einzigen Dinge, die static sein dürfen, sollten bei Dir sein:
  • die main Methode
  • Konstanten

Alle weiteren Dinge sollten NICHT static sein. Auch das Singleton Pattern ist extrem umstritten und sollte vermieden werden! (Über DI / IoC Ansätze bekommt man zwar auch etwas, das ähnlich ist / sein kann, aber ohne die vielen Probleme, die das eigentliche Singleton Pattern mit sich bringt)
 

temi

Top Contributor
Würde ich nicht damit außerdem jedes Mal ein neues Objekt erstellen?:
Erstelle die Instanz nur einmal und verwende sie überall dort, wo du sie benötigst.

Falls eine andere Instanz sie benötigt, dann übergebe sie z. B. im Konstruktor oder über Setter.
Java:
Load load = new Load(); // Klassennamen sollten Substantive sein! => z. B. Loader
load.values();

OtherClass oc = new OtherClass(load); // andere Instanz, die den Loader benötigt

// oder z. B.

oc.setLoader(load);

// oder z. B.

oc.doSomethingWithAList(load.getList());

Die Antwort ist allerdings, sagen wir mal, etwas "aus dem Fenster gelehnt", ohne genaueres über dein Vorhaben zu wissen. :)

Ansonsten gilt in den meisten Fällen, was zu "static" im Beitrag darüber steht.
 

_user_q

Aktives Mitglied
Erstelle die Instanz nur einmal und verwende sie überall dort, wo du sie benötigst.

Falls eine andere Instanz sie benötigt, dann übergebe sie z. B. im Konstruktor oder über Setter.
Java:
Load load = new Load(); // Klassennamen sollten Substantive sein! => z. B. Loader
load.values();

OtherClass oc = new OtherClass(load); // andere Instanz, die den Loader benötigt

// oder z. B.

oc.setLoader(load);

// oder z. B.

oc.doSomethingWithAList(load.getList());

Die Antwort ist allerdings, sagen wir mal, etwas "aus dem Fenster gelehnt", ohne genaueres über dein Vorhaben zu wissen. :)

Ansonsten gilt in den meisten Fällen, was zu "static" im Beitrag darüber steht.
Also kann ich dieses Access static 'Loader.values()' via class 'Loader' reference' ignorieren?

Wenn ich dann 4 Klassen habe, von denen ich Methoden aufrufen muss, ist der folgende Code also nicht falsch?:
Java:
Loader loader = new Loader();
Zweite zweite = new Zweite();
Dritte dritte = new Dritte();
Vierte vierte = new Vierte();

// ...
void funktion() {
    loader.XY();
    zweite.XY();
    dritte.XY();
    vierte.XY();
}
 

temi

Top Contributor
Wenn ich dann 4 Klassen habe, von denen ich Methoden aufrufen muss, ist der folgende Code also nicht falsch?:
Kommt drauf an. Wenn die vier deklarierten Variablen Instanzvariablen der Klasse mit der Methode funktion() sind (Methodenamen sollten wiederum Verben sein), dann ist der Code (vielleicht) richtig. Ansonsten würde die Methode funktion() die Variablen nicht kennen und der Code wäre falsch.

Aber ja, in der Regel werden Instanzen von Klassen erstellt und mit diesen Instanzen wird gearbeitet, z. B. indem Methoden darauf aufgerufen werden.

Was du mit deiner ersten Aussage meinst, ist mir nicht ganz klar. Vielleicht solltest du zeigen, wie die Klasse aussieht, um das verstehen oder verbessern zu können.
 

_user_q

Aktives Mitglied
Kommt drauf an. Wenn die vier deklarierten Variablen Instanzvariablen der Klasse mit der Methode funktion() sind (Methodenamen sollten wiederum Verben sein), dann ist der Code (vielleicht) richtig. Ansonsten würde die Methode funktion() die Variablen nicht kennen und der Code wäre falsch.

Aber ja, in der Regel werden Instanzen von Klassen erstellt und mit diesen Instanzen wird gearbeitet, z. B. indem Methoden darauf aufgerufen werden.

Was du mit deiner ersten Aussage meinst, ist mir nicht ganz klar. Vielleicht solltest du zeigen, wie die Klasse aussieht, um das verstehen oder verbessern zu können.
Was ist mit der ersten Aussage meine:
Wenn ich über diese gelbmarkierten Zeilen mit der Maus hover, dann erscheint der Text Access static 'Loader.values()' via class 'Loader' reference':
Java:
loader.XY();
zweite.XY();
dritte.XY();
vierte.XY();
 

temi

Top Contributor
Vielleicht solltest du zeigen, wie die Klasse aussieht, um das verstehen oder verbessern zu können.
Was ich damit meinte ist, zeig doch einfach mal deine Klasse Load(er).

Vermutlich ist die Methode values() als 'static" deklariert und da gilt für den Anfang erst mal:
Generell solltest Du objektorientiert arbeiten und static bricht dies in der Regel. Die einzigen Dinge, die static sein dürfen, sollten bei Dir sein:
  • die main Methode
  • Konstanten
 

KonradN

Super-Moderator
Mitarbeiter
Also kann ich dieses Access static 'Loader.values()' via class 'Loader' reference' ignorieren?
Da es nur eine Warnung ist, könntest Du es ignorieren. Aber die Warnung hat einen guten Grund: Klassenmethoden werden über die Klasse aufgerufen, damit das auch im Aufruf direkt sichtbar ist.

Statt dem
Java:
Load load = new Load();
load.values();

sollte es einfach ein:
Java:
Load load = new Load();
Load.values();
sein.

Also statt der Instanzvariable einfach die Klasse angeben!
 

KonradN

Super-Moderator
Mitarbeiter
Die Klasse hat doch alles static. Wozu willst Du da überhaupt jemals einen Konstruktor aufrufen?

Und warum ist da alles static? Wenn Du einen Loader brauchst, dann erstellst Du einen. FXMLLoader ist auch so ein Loader. Da erstellst Du eine Instanz, wenn Du es brauchst.
 

temi

Top Contributor
Ah! Es wäre zielführend gewesen, das gleich am Anfang zu erwähnen. ;)

So war von einer selbst erstellten Klasse auszugehen.
 

_user_q

Aktives Mitglied
Die Klasse hat doch alles static. Wozu willst Du da überhaupt jemals einen Konstruktor aufrufen?

Und warum ist da alles static? Wenn Du einen Loader brauchst, dann erstellst Du einen. FXMLLoader ist auch so ein Loader. Da erstellst Du eine Instanz, wenn Du es brauchst.
Also brauche ich das alles doch nicht und kann es bei z. B. Loader.functionXY(); belassen? Ich bin verwirrt ...
 

temi

Top Contributor
Muss ich jetzt überhaupt von dem allem hier etwas in meinen Code aufnehmen?
Nein, du rufst einfach die statischen Methoden über den Klassennamen auf. Den Konstruktor brauchst du nicht.

Es gibt manchmal Gründe, Variablen oder Methoden statisch zu machen, wie hier im JavaFX Framework. Man sollte allerdings schon wissen, warum man es tut und was es bewirkt. Ansonsten lass dich nicht verwirren, die oben genannten Tipps zu "static" gelten schon i.d.R., insbesonders für Einsteiger und vermutlich auch für den Rest deines Programms. :)
 
Zuletzt bearbeitet:

temi

Top Contributor
Allerdings bin ich trotzdem etwas verwirrt. Eine schnelle Suche in der Doku von JavaFX hat keine Klasse "Loader" gefunden, allenfalls "FXMLLoader". Woher kommt diese Klasse denn nun? Vielleicht hab ich sie allerdings auch übersehen...
 

KonradN

Super-Moderator
Mitarbeiter
Moment, das ist doch eine selbst geschriebene Klasse. Und da ist es egal, ob man es ein JavaFX einsetzen will oder ob man kein JavaFX nutzt.

Die Klasse ist aus meiner Sicht ein Beispiel, wie man etwas auf keinen Fall machen sollt! Du hast da sehr viel State drin, also Daten. Wie willst Du sowas vernünftig testen? Ohne da irgend wem zu nahe treten zu wollen: So ist die Klasse einfach Müll.

Bitte schau Dir an, wie man Instanzen erzeugt und verwendet. Der Code zeigt auch an anderen Stellen, dass es da massiv Defizite gibt, denn es macht den Eindruck, dass sonst sehr viel bei Dir Singeltons sind. Main und ControllerRepository fallen da direkt ins Auge.

Ich weiss nicht, was Du da an Programm schreibst, aber ich befürchte, dass Du mit dem Ansatz noch in starke Probleme rennen wirst.
 

KonradN

Super-Moderator
Mitarbeiter
Allerdings bin ich trotzdem etwas verwirrt. Eine schnelle Suche in der Doku von JavaFX hat keine Klasse "Loader" gefunden, allenfalls "FXMLLoader". Woher kommt diese Klasse denn nun? Vielleicht hab ich sie allerdings auch übersehen...
Das ist eine von ihm erstellte Klasse. Du wirst in JavaFX keine Klassen finden, die rein statisch sind und dabei einen State haben. Du magst Utility-Klassen finden, aber nie so etwas. :)
 

KonradN

Super-Moderator
Mitarbeiter
Wollen wir einfach einmal ein paar Dinge etwas erläutern, damit klar ist, warum man gewisse Dinge nicht machen sollte. Das ist ein hoch komplexes Thema und da kommen dann auch so Themen mit rein wie: Warum Interfaces und so...

Das Ganze halten wir sehr visuell, d.h. ich nehme ein anschauliches Beispiel. Da lässt sich nicht alles 1:1 übertragen, aber bestimmt hilft es.

Das grobe Bild:
Nehmen wir einfach einmal eine Fabrik. In der Fabrik sind diverse Maschinen und jede Maschine besteht wieder aus irgendwelchen Bauteilen.

Wenn man sich das etwas anschaut, dann erkennt man mehrere Dinge.
  • Es gibt sowas wie Ebenen: Ganz oben ist die Fabrik. Das ist sozusagen das, was alles umschliesst. In der Fabrik gibt es dann diverse Maschinen. Die Fabrik weiss natürlich, was für Maschinen in der Fabrik sind. Jede Maschine besteht aus Bauteilen. Also z.B. Zahnräder, Schrauben, .... Die Fabrik hat keine Ahnung, was für Schrauben in den Maschinen sind - wenn man das also etwas abstrahiert, dann interessiert eine Ebene immer maximal die direkt anliegende - es wird aber nie eine Ebene übersprungen.
  • Es gibt Schnittstellen. Eine Maschine bekommt einen Input, hat einen Output und es gibt Steuermöglichkeiten.
  • Man erkennt hier, dass es sehr sinnvoll ist, die Schnittstelle festzulegen. Dann kann ich Teil gegen einen anderen austauschen, das die gleiche Schnittstelle hat. Das kann also sein, dass man in einer Maschine eine Schraube durch eine andere austauscht. Oder eine ganze Maschine durch eine andere.
  • Abhängigkeiten sind etwas ganz schlimmes. Wenn die Maschine eine feste Abhängigkeit hat zu der Fabrik, dann kannst Du die Maschine nicht in einer anderen Fabrik verwenden. Oder wenn es eine feste Abhängigkeit zu einer anderen Maschine gibt, dann ist die Einsatzmöglichkeit sehr begrenzt. Machen wir da mal ein Bespiel:

M1 ist eine Maschine, die Stahlrohre herstellt.
M2 ist eine Maschine, die Stahlrohre annimmt um diese zu Fahrradrahmen zusammen zu fügen / schweissen.
Wenn Du bei der Herstellung von M1 und M2 die Abhängigkeit fest einbaust, also M1 gibt Stahlrohre direkt an M2 und M2 nimmt die auch immer direkt von M1, dann hast Du ein Problem. Wenn Du jetzt aus Stahlrohren ein Sicherheitskäfig für ein Ralley-Fahrzeug bauen willst, dann kannst Du M1 nicht verwenden, denn M1 würde die Stahlrohre ja an M2 geben und du hast keine Chance, das an eine andere Maschine M3 anzuschließen.
Und wenn Du nun Rohre aus einer anderen Quelle als M1 verarbeiten willst: Mit M2 ist das auch nicht möglich.

Wenn man jetzt mehrere Fabriken betrachtet, dann hat man da Abhängigkeiten zwischen den Fabriken. Aber nie zu einer konkreten Maschine. Wenn ich als Fabrik2 von Fabrik1 Fahrradrahmen haben will, dann ist es mir egal, ob das eine Maschine M2 macht oder irgend eine andere Maschine. Mir ist nur wichtig: Fabrik1 muss liefern. Und Abhängigkeiten gehen nur in eine Richtung (so möglich). Also Fabrik1 liefert Fahrradrahmen an Fabrik2 .... Fabrik2 liefert aber nichts an Fabrik1. (Das ist ein etwas problematischer Vergleich. Hier geht es mehr darum, wer etwas anspricht. Also Fabrik1 liefert etwas an Fabrik2, aber dabei kann etwas zurück kommen. Also es werden Fahrradrahmen geliefert und ein Koffer mit Geld wird dann auf der Rückfahrt mitgenommen.)

Was bedeutet das für einen Software Entwickler:
  • Natürlich machen wir nichts rein statisch. Das würde ja bedeuten, dass man nur genau eine Maschine hätte. Aber man will vielleicht mehrere haben...
  • Wie achten auf Ebenen und auf Module. Wenn es also möglich ist, machen wir Module (was dann die Fabriken wären). Diese sind relativ abgeschlossen und haben auch klare Ein- und Ausgänge sowie Steuerungsmöglichkeiten. Und wie bei Klassen Internas gekapselt werden, ist das bei Modulen ähnlich.

Bei eine JavaFX Applikation kann man das dann ähnlich aufbauen:
  • Du hast eine Applikation, die alles Kapselt. Die weiss also, was für Komponenten es sonst gibt.
  • Die Applikation kann die Komponenten miteinander verbinden. Die Komponenten kennen also nicht die Applikation oder so.

Wenn eine Komponente Abhängigkeiten hat zu anderen Komponenten, dann kann das so aussehen:
M1 liefert Stahlrohre an M2. M1 ist also ein Producer und M2 ein Consumer (von Stahlrohren)
M1 braucht aber natürlich den Stahl also ist auch ein Consumer<Stahl>

Damit M1 funktioniert, braucht es aber einen Producer<Stahl> und einen Consumer<Stahlrohr>

Das wäre bei M1 also etwas wie:
Java:
M1 liefert Stahlrohre an M2. M1 ist also ein Producer und M2 ein Consumer
(von Stahlrohren)
M1 braucht aber natürlich den Stahl also ist auch ein Consumer<Stahl>

Damit M1 funktioniert, braucht es aber einen Producer<Stahl> und einen Consumer<Stahlrohr>


public class M1 implements Producer<Stahlrohr>, Consumer<Stahl> {
  public M1(Producer<Stahl> stahlLieferant, Consumer<Stahlrohr> stahlrohrAbhnehmer) {
    // ...
  }
}

Das würde beide Richtungen abdecken. Braucht man aber oft nicht. In der Regel ist eine Seite aktiv und die andere passiv. Das Stahl kommt aus dem Stahllager und die Maschine M1 kann es anfordern. Und die Maschine M1 gibt es aktiv an die Maschine M2.
Wenn M2 die Stahlrohre bekommt, dann ist es egal, woher es kommt. Das muss die Maschine ja nicht wissen.

Ein weiterer, wichtiger Punkt: Wenn die Interfaces Funktional sind, dann braucht man dieses implements nicht. Dann hat man einfach entsprechende Methoden oder man gibt es als Lambda Expression an.

Beispiel:
Das Interface Consumer<Stahlrohr> hat eine Methode verwende(Stahlrohr)
M2 hat eine Methode, die heisst produziereFahrradrahmen(Stahlrohr) und implementiert nicht Consumer<Stahlrohr>.

Das Consumer<Stahlrohr> kann dann bei einer Instanz m2 angegeben werden als:
m2::produziereFahrradrahmen ==> Methodenreferenz
r -> m2.produziereFahrradrahmen(r) ==> Lambda Expression

Das wäre so eine schnelle Übersicht, was da so denkbar wäre und wie so ein Aufbau sein sollte. So kurz lässt sich das aber nicht wirklich gut erläutern. Da gibt es viele - teilweise sehr umfangreiche - Bücher zu. Aber für einen ersten Einblick hat es hoffentlich gereicht. Und ich hoffe, dass ich beim so runter schreiben nicht groß Tippfehler und so eingebaut habe.
 

_user_q

Aktives Mitglied
Wollen wir einfach einmal ein paar Dinge etwas erläutern, damit klar ist, warum man gewisse Dinge nicht machen sollte. Das ist ein hoch komplexes Thema und da kommen dann auch so Themen mit rein wie: Warum Interfaces und so...

Das Ganze halten wir sehr visuell, d.h. ich nehme ein anschauliches Beispiel. Da lässt sich nicht alles 1:1 übertragen, aber bestimmt hilft es.

Das grobe Bild:
Nehmen wir einfach einmal eine Fabrik. In der Fabrik sind diverse Maschinen und jede Maschine besteht wieder aus irgendwelchen Bauteilen.

Wenn man sich das etwas anschaut, dann erkennt man mehrere Dinge.
  • Es gibt sowas wie Ebenen: Ganz oben ist die Fabrik. Das ist sozusagen das, was alles umschliesst. In der Fabrik gibt es dann diverse Maschinen. Die Fabrik weiss natürlich, was für Maschinen in der Fabrik sind. Jede Maschine besteht aus Bauteilen. Also z.B. Zahnräder, Schrauben, .... Die Fabrik hat keine Ahnung, was für Schrauben in den Maschinen sind - wenn man das also etwas abstrahiert, dann interessiert eine Ebene immer maximal die direkt anliegende - es wird aber nie eine Ebene übersprungen.
  • Es gibt Schnittstellen. Eine Maschine bekommt einen Input, hat einen Output und es gibt Steuermöglichkeiten.
  • Man erkennt hier, dass es sehr sinnvoll ist, die Schnittstelle festzulegen. Dann kann ich Teil gegen einen anderen austauschen, das die gleiche Schnittstelle hat. Das kann also sein, dass man in einer Maschine eine Schraube durch eine andere austauscht. Oder eine ganze Maschine durch eine andere.
  • Abhängigkeiten sind etwas ganz schlimmes. Wenn die Maschine eine feste Abhängigkeit hat zu der Fabrik, dann kannst Du die Maschine nicht in einer anderen Fabrik verwenden. Oder wenn es eine feste Abhängigkeit zu einer anderen Maschine gibt, dann ist die Einsatzmöglichkeit sehr begrenzt. Machen wir da mal ein Bespiel:

M1 ist eine Maschine, die Stahlrohre herstellt.
M2 ist eine Maschine, die Stahlrohre annimmt um diese zu Fahrradrahmen zusammen zu fügen / schweissen.
Wenn Du bei der Herstellung von M1 und M2 die Abhängigkeit fest einbaust, also M1 gibt Stahlrohre direkt an M2 und M2 nimmt die auch immer direkt von M1, dann hast Du ein Problem. Wenn Du jetzt aus Stahlrohren ein Sicherheitskäfig für ein Ralley-Fahrzeug bauen willst, dann kannst Du M1 nicht verwenden, denn M1 würde die Stahlrohre ja an M2 geben und du hast keine Chance, das an eine andere Maschine M3 anzuschließen.
Und wenn Du nun Rohre aus einer anderen Quelle als M1 verarbeiten willst: Mit M2 ist das auch nicht möglich.

Wenn man jetzt mehrere Fabriken betrachtet, dann hat man da Abhängigkeiten zwischen den Fabriken. Aber nie zu einer konkreten Maschine. Wenn ich als Fabrik2 von Fabrik1 Fahrradrahmen haben will, dann ist es mir egal, ob das eine Maschine M2 macht oder irgend eine andere Maschine. Mir ist nur wichtig: Fabrik1 muss liefern. Und Abhängigkeiten gehen nur in eine Richtung (so möglich). Also Fabrik1 liefert Fahrradrahmen an Fabrik2 .... Fabrik2 liefert aber nichts an Fabrik1. (Das ist ein etwas problematischer Vergleich. Hier geht es mehr darum, wer etwas anspricht. Also Fabrik1 liefert etwas an Fabrik2, aber dabei kann etwas zurück kommen. Also es werden Fahrradrahmen geliefert und ein Koffer mit Geld wird dann auf der Rückfahrt mitgenommen.)

Was bedeutet das für einen Software Entwickler:
  • Natürlich machen wir nichts rein statisch. Das würde ja bedeuten, dass man nur genau eine Maschine hätte. Aber man will vielleicht mehrere haben...
  • Wie achten auf Ebenen und auf Module. Wenn es also möglich ist, machen wir Module (was dann die Fabriken wären). Diese sind relativ abgeschlossen und haben auch klare Ein- und Ausgänge sowie Steuerungsmöglichkeiten. Und wie bei Klassen Internas gekapselt werden, ist das bei Modulen ähnlich.

Bei eine JavaFX Applikation kann man das dann ähnlich aufbauen:
  • Du hast eine Applikation, die alles Kapselt. Die weiss also, was für Komponenten es sonst gibt.
  • Die Applikation kann die Komponenten miteinander verbinden. Die Komponenten kennen also nicht die Applikation oder so.

Wenn eine Komponente Abhängigkeiten hat zu anderen Komponenten, dann kann das so aussehen:
M1 liefert Stahlrohre an M2. M1 ist also ein Producer und M2 ein Consumer (von Stahlrohren)
M1 braucht aber natürlich den Stahl also ist auch ein Consumer<Stahl>

Damit M1 funktioniert, braucht es aber einen Producer<Stahl> und einen Consumer<Stahlrohr>

Das wäre bei M1 also etwas wie:
Java:
M1 liefert Stahlrohre an M2. M1 ist also ein Producer und M2 ein Consumer
(von Stahlrohren)
M1 braucht aber natürlich den Stahl also ist auch ein Consumer<Stahl>

Damit M1 funktioniert, braucht es aber einen Producer<Stahl> und einen Consumer<Stahlrohr>


public class M1 implements Producer<Stahlrohr>, Consumer<Stahl> {
  public M1(Producer<Stahl> stahlLieferant, Consumer<Stahlrohr> stahlrohrAbhnehmer) {
    // ...
  }
}

Das würde beide Richtungen abdecken. Braucht man aber oft nicht. In der Regel ist eine Seite aktiv und die andere passiv. Das Stahl kommt aus dem Stahllager und die Maschine M1 kann es anfordern. Und die Maschine M1 gibt es aktiv an die Maschine M2.
Wenn M2 die Stahlrohre bekommt, dann ist es egal, woher es kommt. Das muss die Maschine ja nicht wissen.

Ein weiterer, wichtiger Punkt: Wenn die Interfaces Funktional sind, dann braucht man dieses implements nicht. Dann hat man einfach entsprechende Methoden oder man gibt es als Lambda Expression an.

Beispiel:
Das Interface Consumer<Stahlrohr> hat eine Methode verwende(Stahlrohr)
M2 hat eine Methode, die heisst produziereFahrradrahmen(Stahlrohr) und implementiert nicht Consumer<Stahlrohr>.

Das Consumer<Stahlrohr> kann dann bei einer Instanz m2 angegeben werden als:
m2::produziereFahrradrahmen ==> Methodenreferenz
r -> m2.produziereFahrradrahmen(r) ==> Lambda Expression

Das wäre so eine schnelle Übersicht, was da so denkbar wäre und wie so ein Aufbau sein sollte. So kurz lässt sich das aber nicht wirklich gut erläutern. Da gibt es viele - teilweise sehr umfangreiche - Bücher zu. Aber für einen ersten Einblick hat es hoffentlich gereicht. Und ich hoffe, dass ich beim so runter schreiben nicht groß Tippfehler und so eingebaut habe.

Und ich hoffe, dass ich beim so runter schreiben nicht groß Tippfehler und so eingebaut habe.
Da würde ich nichts aussetzen, ich habe deinen Text verstehen können. Ich habe mich auch noch mal live beraten lassen. Ich danke dir!
 

White_Fox

Top Contributor
Meine Frage: Wie kann ich die Funktion values() mit dem Constructor aufrufen?
Würde ich nicht damit außerdem jedes Mal ein neues Objekt erstellen?:
@KonradN hat ja zum Glück schon so einen langen Salm geschrieben, das wollte ich auch gerade tun.

Du solltest dir das Thema Objektorientierung dringend verinnerlichen. Wenn man es mal verstanden hat ist es so natürlich wie der aufrechte Gang, aber es dauert doch ein wenig die Denkweise so richtig zu übernehmen.

Grundsätzlich sind Objekte erstmal Dinge, die eine gewisse Eigenständigkeit haben und (idealerweise exakt eine einzige) Aufgabe erfüllen.
Nimm z.B. mal ein beliebiges Programm, das mit einem Server kommunizieren soll. Dann könntest du z.B. eine Klasse "ServerConnector" haben, die nach außen hin zwei Methoden bereitstellt, einmal um Daten zu senden und einmal um empfangene Daten abzuholen, von außen ganz einfach.

Der innere Aufbau dieser Klasse kann jetzt beliebig kompliziert sein. Es kann z.B. erforderlich sein, sich in bestimmten Zeitintervallen beim Server melden zu müssen damit der Server weiß, daß der Client noch lebt. Ansonsten nimmt der Server an, das Programm wurde beendet und der Server unterbricht die Verbindung. Die Daten können auch noch verschlüsselt werden, bevor sie an den Server rausgehen, usw.
Darum würde sich die Klasse ServerConnector z.B. kümmern.
Zeigt sehr schön, warum Objektorientierung so geil ist: von außen recht einfach zu benutzen, innen passieren wunderliche Dinge in denen man von außen auch bitte nicht herumrühren soll, deshalb auch der ganze Kram mit Sichtbarkeitsmodifizierern wie private, public, usw. Es wäre doch auch zu dumm, wenn man den Kryptoschlüssel im Klartext irgendwo in eine Datei ablegen könnte, nur weil jemand meint das wäre eine einfache Lösung für sein Problem und noch sicher genug. Ein 'private' verhindert dies.

Und um jetzt zu deiner Frage zurückzukommen: Ein Objekt zu erstellen (nichts anderes machst du nämlich, wenn du den Konstruktor aufrufst) nur um eine einzige Methode aufzurufen, läuft dem Sinn eines Objekts zuwider. Es ist gerade umgekehrt: Wenn du eine Methode statisch machst, existiert diese Methode immer, und es wird eben nicht jedesmal ein neues Objekt erzeugt.

Wenn du häufig Methoden über den Konstruktor aufrufen willst ist das ein gutes Anzeichen dafür, daß du da nochmal einiges überdenken (und evt. lesen/lernen) solltest.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
M Wie lang eine Funktion/Methode? Java Basics - Anfänger-Themen 51
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
M Wie kann eine Methode eine andere Methode um Werte wie z.B. 1 erhöhen? Java Basics - Anfänger-Themen 6
B eine methode erstellen Java Basics - Anfänger-Themen 7
B Eine Methode erstellen Java Basics - Anfänger-Themen 3
bensdt Klasse erweitern um eine Methode "void decrement()" Java Basics - Anfänger-Themen 5
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
scratchy1 Kann man in einer Methode eine andere aufrufen? Java Basics - Anfänger-Themen 2
scratchy1 Wie deklariert man eine Methode, die ein Objekt zurückgeben soll? Java Basics - Anfänger-Themen 22
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
S Wie erstelle ich eine Vorbedingung für eine Variable einer Methode ? Java Basics - Anfänger-Themen 5
J Ein Objekt and eine Methode übergeben zwei Schreibweisen? Java Basics - Anfänger-Themen 6
R Eine Schleife durch eine Methode schließen? Java Basics - Anfänger-Themen 4
B Wie kann ich eine Methode einer selbst erstellten Klasse statisch importieren? Java Basics - Anfänger-Themen 5
S Methoden Beim Start meines Projektes eine Methode ausführen Java Basics - Anfänger-Themen 14
M Methoden Int einer Methode an eine andere Methode übergeben Java Basics - Anfänger-Themen 4
H Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? Java Basics - Anfänger-Themen 2
TomatenBrot447 Mit toString eine Ausgabe liefern wie in einer schon implementierten Methode ? Java Basics - Anfänger-Themen 13
TomatenBrot447 Mit toString eine Ausgabe liefern wie in einer schon implementierten Methode ? Java Basics - Anfänger-Themen 1
B Hilfe bei eine Java-Methode Java Basics - Anfänger-Themen 4
G Wie rufe ich eine Methode außerhalb eines Projektes auf? Java Basics - Anfänger-Themen 18
P Variablen Wie kann ich eine lokale Variable in eine andere Methode einfügen? Java Basics - Anfänger-Themen 27
G Gibt es eine Methode die bei einem StringBuilder n mal das Zeichen c hinzufügt? Java Basics - Anfänger-Themen 6
V Vererbung (wie) kann man eine 'super'-Methode auf ein Objekt anwenden ? Java Basics - Anfänger-Themen 6
TheMenox Methoden Bestimmung an welche Methode eine andere Methode ihren Wert weitergeben soll Java Basics - Anfänger-Themen 35
M Best Practice Wann eine Methode schreiben ? Java Basics - Anfänger-Themen 14
G return-wert für eine Methode Java Basics - Anfänger-Themen 1
C Rekursion überführen in eine normale methode Java Basics - Anfänger-Themen 1
H Ist Math.Random() eine Methode oder ein Methodenaufruf (Klausurfrage) Java Basics - Anfänger-Themen 4
F Um 14:00 eine Methode aufrufen Java Basics - Anfänger-Themen 5
T unterklasse will eine methode von der oberklasse nutzen Java Basics - Anfänger-Themen 4
F Problem bei eshop -> Ausführen einer Methode über eine Shopverwaltung Java Basics - Anfänger-Themen 6
O Timeout für eine Methode festlegen Java Basics - Anfänger-Themen 3
llabusch Operatoren Methode um eine Zahl zu quadrieren Java Basics - Anfänger-Themen 1
D Methoden für was eine set zur get - Methode ?? Java Basics - Anfänger-Themen 3
F Teil eines Byte Array an eine Methode übergeben Java Basics - Anfänger-Themen 5
G Erste Schritte Timer: In einem festgelegten Intervall eine Methode ausführen Java Basics - Anfänger-Themen 6
S Methoden Rückgabewert einer Methode als Parameter an eine andere Methode übergeben, geht das? Java Basics - Anfänger-Themen 5
S Methoden void-Methode: Wieso gibt es eine Rückgabe? Java Basics - Anfänger-Themen 5
M Wert von globalen Variablen über eine Methode ändern Java Basics - Anfänger-Themen 8
T Probleme eine Methode zu schreiben Java Basics - Anfänger-Themen 20
J Methode um eine HTML-Datei zu öffnen Java Basics - Anfänger-Themen 10
B auf private Variable durch eine Methode zugreifen Java Basics - Anfänger-Themen 8
P Methoden Erklärung wie ich eine spezielle Methode richtig anwende Java Basics - Anfänger-Themen 9
R eine Methode automatisch wiederholen Java Basics - Anfänger-Themen 12
V Mit JS eine JAVA Methode aufrufen Java Basics - Anfänger-Themen 5
O Überprüfen ob eine Methode ausgeführt wurde Java Basics - Anfänger-Themen 10
T Methode, die eine 2 dimensionale Matrix kopiert. Java Basics - Anfänger-Themen 16
L Methoden Eine Methode aus einer anderen Klasse aufrufen Java Basics - Anfänger-Themen 4
W Methoden Wie wird eine Methode hier aufgerufen? Java Basics - Anfänger-Themen 5
E Methoden Wie kann ich eine Methode so schreiben, dass Methodenaufruf polymorph erfolgen kann? Java Basics - Anfänger-Themen 8
D Von einer Methode auf eine lokale Variable in der Main zugreifen? Java Basics - Anfänger-Themen 15
F Klassen DataBuffer - Methode um Array in eine Bank zu schreiben Java Basics - Anfänger-Themen 3
W Eine Methode schreiben, ob eine Matrix eine Diagonalmatrix ist.? Java Basics - Anfänger-Themen 3
H Eine Methode mehrere Werte zurückgeben lassen Java Basics - Anfänger-Themen 7
L Datentypen eine Methode mit zwei möglichen Rückgabewerten Java Basics - Anfänger-Themen 20
E Variable aus einer Methode heraus in eine andere Klasse übergeben Java Basics - Anfänger-Themen 13
maddin86 Eine Methode für ein- und zweidimensionale double Felder als Parameter? Java Basics - Anfänger-Themen 5
H Reflexion: Eine Methode, beliebig viele Parameter (Java 1.4.2) Java Basics - Anfänger-Themen 8
1 OOP Zugriff auf eine Methode nur einmal die Sekunde Java Basics - Anfänger-Themen 8
E Methode gesucht die eine Abfolge von Ereignissen festsetzt. Java Basics - Anfänger-Themen 3
M Zwei Threads greifen auf eine Methode einer Klasse zu. Komplikationen? Java Basics - Anfänger-Themen 18
B Eine Methode für alle Subklassen aufrufen? Java Basics - Anfänger-Themen 8
A Einer Methode eine andere Methode übergeben Java Basics - Anfänger-Themen 6
Darth Simple Übergabe eines Strings an eine Methode Java Basics - Anfänger-Themen 3
L Aus einer Methode eine eigene Klasse machen - modular coden Java Basics - Anfänger-Themen 14
O Beim Schließen JDialog, im Frame-Owner eine Methode starten Java Basics - Anfänger-Themen 6
G Wie greife ich auf eine Methode zu? Java Basics - Anfänger-Themen 8
G Was passiert mit eine Methode bei einer Instanz Java Basics - Anfänger-Themen 13
G primitive Datentypen als Referenz an eine Methode übergeben Java Basics - Anfänger-Themen 2
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
K Eine Neue Methode Schreiben . Java Basics - Anfänger-Themen 15
StudentXYZ Auf Objekte zugreifen, die eine andere Methode initialisiert Java Basics - Anfänger-Themen 2
M Wert von einer Methode in eine Andere übergeben Java Basics - Anfänger-Themen 6
B Wie eine Methode aufrufen? Java Basics - Anfänger-Themen 2
G JComboBox um eine Methode erweitern Java Basics - Anfänger-Themen 2
E eine 'showDialog'-Methode erstellen Java Basics - Anfänger-Themen 9
B Wie aus instanzierter Klasse eine Methode der Main-Klasse Java Basics - Anfänger-Themen 9
M Methode einer Klasse in eine andere Übergeben Java Basics - Anfänger-Themen 4
T gibt es eine methode die einem alle Strings zurückliefert? Java Basics - Anfänger-Themen 7
G eine methode die zählt Java Basics - Anfänger-Themen 3
H strings in eine andere methode übergeben? Java Basics - Anfänger-Themen 6
W Eine Methode, mehrfacher gleichzeitger Ablauf möglich? Java Basics - Anfänger-Themen 2
A Wert einer Variable an eine Methode in einer anderen Klasse. Java Basics - Anfänger-Themen 4
M Brauche ein Beispiel für eine set() get() Methode Java Basics - Anfänger-Themen 4
M Konstruktor eine statische Methode? Java Basics - Anfänger-Themen 9
G Eine Methode zum Warten? Java Basics - Anfänger-Themen 7
G Auf eine Methode zugreifen Java Basics - Anfänger-Themen 2
B in einer Methode eine andere Methode aufrufen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben