Interface Parameter und Rückgabewerte in Lambda Ausdrücken verwenden

Cepheus

Mitglied
Durch Implementierung einer anonymen Klasse konnte ich ein von mir erstelltes Interface problemlos verwenden. Ich möchte lernen, wie ich das Interface über einen Lambda-Ausdruck ansprechen kann.
Die angehängten Dateien enthalten meine Klasse Zutat und das Interface ZutatVerarbeiten.

Besten Dank im Voraus!
Cepheus
 

Anhänge

  • Zutat.java
    1,9 KB · Aufrufe: 0
  • ZutatVerarbeiten.java
    80 Bytes · Aufrufe: 0

httpdigest

Top Contributor
Code einfach als Code über den </> Button im Editor. Nicht als File-Upload.
Dein auskommentierter Code in der Zutat.java:
z.zubereiten( anz -> { if(anz <= ANZ_AUFLAGER) {......
funktioniert so nicht, weil die Methode zubereiten der Klasse Zutat ja weiterhin zwei Parameter erwartet. Erst der zweite Parameter ist ja das ZutatVerarbeiten Interface, für das du einen Lambda-Ausdruck verwenden kannst.
Du müsstest die Methode also so aufrufen: z.zubereiten(z.anz, anz -> { if(anz <= ANZ_AUFLAGER) {......
Insgesamt ist die objektorientierte Modellierung hier aber sehr merkwürdig.
 

Cepheus

Mitglied
Besten Dank für deine schnelle Hilfe! War sehr lehrreich.
Aber jetzt machst du mich noch neugierig, wie man solche Aufgaben besser angehen soll, also nicht über die objektorientierte Modellierung.
Gruß,
Cepheus
 

Robert Zenz

Top Contributor
Naja, "objektorientierte Modellierung" ist halt biszchen anders als das was du machst. Naja dran, aber nicht ganz ideal.

Zuerst, kuerze keine Variablennamen ab nur weil du kannst, anz ist da ein gutes Beispiel, z ein noch viel schoeneres. Es macht den Code schwerer zu lesen und zu verstehen.

Das gesagt, du hast da ja die Zutat Klasse welche schon nahe d'ran ist, aber du mischt da noch die Verarbeitung als auch die Hauptlogik mithinein. Dein ZutatVerarbeiten ist auch kein richtiges "Zutat Verarbeiten", sondern mehr ein "Anzahl verarbeiten", und dass die Pruefung auf die Anzahl erst dort stattfindet ist vielleicht etwas spaet.

Also wenn man das etwas aufbereiten will:

Code:
Main.java
Zutat.java
ZutatVerarbeitung.java

Dann hat man in der Main.java die Hauptlogik vom Programm, Zutat tut nichts auszer Namen und Anzhal zu halten, und ZutatVerarbeitung wuerde die Zutat tatsaechlich verarbeiten. Jetzt ist hier aber das Problem dass wir die Anforderungen nicht kennen, also wir koennen dir gar nicht sagen wie man das wirklich geschickter aufbaut weil wir die Anforderungen nicht kennen. Demnach wuerde ich eher eine solche Struktur raten:

Code:
Main.java
Rezept.java
Zutat.java
VerarbeiteteZutat.java
Verarbeitung.java

Und jetzt folgt ein biszchen Pseudo-Code wie die Umsetzung aussehen koennte.

Java:
public static final class Main() {
    private Main() {
    }
   
    public static final void main(String[] arguments) {
        Rezept rezept = new Rezept("Etwas");
        rezept.add(new Zutat("Zwiebel", 1, Verarbeitungen.WUERFELN));
        rezept.add(new Zutat("Knoblauchzehen", 3, Verarbeitungen.SCHNEIDEN));
        rezept.add(new Zutat("Paprika", 2, Verarbeitungen.WUERFELN));
        rezept.add(new Zutat("Bohnen", 50, Verarbeitungen.KEINE));
      
        for (Zutat zutat : rezept.getZutaten()) {
            rezept.add(zutat.verarbeiten());
        }
       
        rezept.kochen();
    }
}

public interface Verarbeitung {
    public VerarbeiteteZutat verarbeiten(Zutat zutat);
}

public final class Verarbeitungen {
    public static final Verarbeitung KEINE = (zutat) -> new VerarbeitetZutat(zutat.getName(), zutat.getAnzahl());
    public static final Verarbeitung SCHNEIDEN = (zutat) -> new VerarbeitetZutat("Geschnittene " + zutat.getName(), zutat.getAnzahl());
    public static final Verarbeitung WUERFELN = (zutat) -> new VerarbeitetZutat("Gewuerfelte " + zutat.getName(), zutat.getAnzahl());
  
    private Verarbeitungen() {
    }
}

Zum Beispiel. Aber wie gesagt, ohne Anforderung etwas schwer abzuschaetzen was genau man bauen soll.

Man kann die Verarbeitungen dann auch direkt einbetten:

Java:
rezept.add(new Zutat("Zwiebel", 1, (zutat) -> new VerarbeiteteZutat("Geschnittene " + zutat.getName(), zutat.getAnzahl())));

Also in erster Linie versucht man seine Datenhaltung und die Datenverarbeitung ein wenig von einander zu trennen. Halten von Daten ist immer einfach, da baut man sich dann ein POJO (Plain Old Java Object), also eine Klasse mit Gettern und Settern, und das verarbeiten lagert man dann irgendwo anders aus. Hier in dem Fall hat es Sinn gemacht jeder Zutat direkt den Verarbeitungsschritt mit zu geben, aber es kann auch durchaus denkbar sein dies erst (dynamisch) in der Schleife bei der Zubereitung aufzuloesen.

Also du willst quasi immer deine Verarbeitung soweit wegabstrahiert haben dass du diese relativ einfach erweitern, aendern oder austauschen kannst. Idealerweise wissen die Daten gar nichts von dem wie sie verarbeitet werden, geht sie ja nichts, und auszerdem wird sich das vermutlich ohnehin noch dreimal aendern oder erweitert werden. Von dem her koennte ich mir auch ein duales System vorstellen wo man Zutaten zusammen mit der Verarbeitung registriert im Rezept:

Java:
Rezept rezept = new Rezept("Etwas");
rezept.add(new Zutat("Zwiebeln", 5), Verarbeitung.WUERFELN);

Damit hast du dann die Zutat von der Verarbeitung komplett getrennt. Und idealerweise beziehst du die Zutaten aus einem Lagerraum:

Java:
Rezept rezept = new Rezept("Etwas");
rezept.add(lagerraum.hole("Zwiebeln", 5), Verarbeitung.WUERFELN);

Weil dann kann naemlich schon der Lagerraum einen Fehler werfen dass es nicht mehr genug Zwiebeln gibt.

Aber wie gesagt, ohne die Anforderung alles schwer zu sagen.
 

KonradN

Super-Moderator
Mitarbeiter
Da sieht was faul aus... Das müsste sein: z.zubereiten((anz1, anz2) -> { if(anz1 <= ANZ_AUFLAGER) {...

Mehr als 1 Parameter, müssen immer geklammert werden.

@httpdigest hat es doch geschrieben:
weil die Methode zubereiten der Klasse Zutat ja weiterhin zwei Parameter erwartet. Erst der zweite Parameter ist ja das ZutatVerarbeiten Interface, für das du einen Lambda-Ausdruck verwenden kannst.

Also auch ohne in die Anhänge zu schauen, wäre klar, wieso der Code, den @httpdigest geschrieben hat, eben doch korrekt ist.

Oder noch einmal deutlich mit anderen Worten: Die Methode, die durch die Lambda Expression aufgerufen werden soll, hat nur einen Parameter:
Java:
public interface ZutatVerarbeiten {
    public boolean schneiden(int anz);
}

Und die Methode, die aufgerufen wird:
Java:
    public boolean zubereiten(int anz, ZutatVerarbeiten z) {    // Deklaration einer Klassenmethode
        return z.schneiden(anz);
    }
 

M.L.

Top Contributor
objektorientierte Modellierung
Zusatz: OO bedeutet im Minimalfall, dass Objekte und (die sie betreffenden) Methoden über eine (oder mehrere) Klasse(n) in einen Zusammenhang gebracht werden. In Java kann man aber wie in einer Script-Sprache vorgehen wenn man nur statische Methoden / Variablen verwendet.
 

KonradN

Super-Moderator
Mitarbeiter
Ach Tobias, lies doch einfach einmal genau, was geschrieben wurde. Dann wirst selbst Du verstehen, dass die Methode des funktionalen Interfaces nur einen Parameter hat. Der Lambda Ausdruck ist also nur anz -> { if(anz <= ANZ_AUFLAGER) {......`

Die Methode, die aufgerufen wird, hat aber zwei Parameter: public boolean zubereiten(int anz, ZutatVerarbeiten z)

Somit muss man bei Aufruf erst einen Parameter für anz angeben und dann einen Parameter für ZutatVerarbeiten. Letzteres kann dann ein Lambda Ausdruck sein wie es @httpdigest gemacht hat.

Also ganz einfache Java Grundlagen - die selbst Du verstehen solltest.

Dass die Modellierung "nicht gut" ist, ist hier nicht das Thema gewesen.
Es wurde aber zum Thema, denn das ist erwähnt worden und der TE hat aktiv nachgefragt. Damit wurde es Thema. Aber ja - das setzt natürlich voraus, dass man den Threadverlauf liest und versteht. Letzteres ist natürlich nicht der Fall bei Dir, denn sonst hättest Du ja mitbekommen, dass das Lambda nur einen Parameter hat...
 

Robert Zenz

Top Contributor

Cepheus

Mitglied
Guten Tag, meine Herren!
Wie man sieht, habe ich mit meiner Frage eine größere Diskussion ausgelöst. Ja, fast einen "Disput" ;) unter den Experten. Nun kann ich aber als ganz grüner Anfänger "bezeugen", dass httpdigest in seinem Statement:

... weil die Methode zubereiten der Klasse Zutat ja weiterhin zwei Parameter erwartet. Erst der zweite Parameter ist ja das ZutatVerarbeiten Interface, für das du einen Lambda-Ausdruck verwenden kannst.
Du müsstest die Methode also so aufrufen: z.zubereiten(z.anz, anz -> { if(anz <= ANZ_AUFLAGER) {......

recht hat. Seine Empfehlung habe ich nämlich realisiert und so funktioniert es.

Ich habe von ihm etwas wichtiges gelernt: dass man sich vor dem Aufruf einer Klassenmethode deren Deklaration genau ansehen muss und darin jenen Parameter identifizieren muss (Schnittstellen-Typ!), der als ein Lambda-Ausdruck übergeben werden kann. Die anderen Parameter, also solche, deren Typ nicht das Interface sind, zählen nicht zu den Parametren des Lambda-Ausdrucks.

Ich bedanke mich bei allen Diskutanten, auch für andere nützliche Tipps (unnötige Kürzung von Variablennemen, Modellierung).
Cepheus
 

Cepheus

Mitglied
Naja, "objektorientierte Modellierung" ist halt biszchen anders als das was du machst. Naja dran, aber nicht ganz ideal.

Zuerst, kuerze keine Variablennamen ab nur weil du kannst, anz ist da ein gutes Beispiel, z ein noch viel schoeneres. Es macht den Code schwerer zu lesen und zu verstehen.

Das gesagt, du hast da ja die Zutat Klasse welche schon nahe d'ran ist, aber du mischt da noch die Verarbeitung als auch die Hauptlogik mithinein. Dein ZutatVerarbeiten ist auch kein richtiges "Zutat Verarbeiten", sondern mehr ein "Anzahl verarbeiten", und dass die Pruefung auf die Anzahl erst dort stattfindet ist vielleicht etwas spaet.

Also wenn man das etwas aufbereiten will:

Code:
Main.java
Zutat.java
ZutatVerarbeitung.java

Dann hat man in der Main.java die Hauptlogik vom Programm, Zutat tut nichts auszer Namen und Anzhal zu halten, und ZutatVerarbeitung wuerde die Zutat tatsaechlich verarbeiten. Jetzt ist hier aber das Problem dass wir die Anforderungen nicht kennen, also wir koennen dir gar nicht sagen wie man das wirklich geschickter aufbaut weil wir die Anforderungen nicht kennen. Demnach wuerde ich eher eine solche Struktur raten:

Code:
Main.java
Rezept.java
Zutat.java
VerarbeiteteZutat.java
Verarbeitung.java

Und jetzt folgt ein biszchen Pseudo-Code wie die Umsetzung aussehen koennte.

Java:
public static final class Main() {
    private Main() {
    }
  
    public static final void main(String[] arguments) {
        Rezept rezept = new Rezept("Etwas");
        rezept.add(new Zutat("Zwiebel", 1, Verarbeitungen.WUERFELN));
        rezept.add(new Zutat("Knoblauchzehen", 3, Verarbeitungen.SCHNEIDEN));
        rezept.add(new Zutat("Paprika", 2, Verarbeitungen.WUERFELN));
        rezept.add(new Zutat("Bohnen", 50, Verarbeitungen.KEINE));
     
        for (Zutat zutat : rezept.getZutaten()) {
            rezept.add(zutat.verarbeiten());
        }
      
        rezept.kochen();
    }
}

public interface Verarbeitung {
    public VerarbeiteteZutat verarbeiten(Zutat zutat);
}

public final class Verarbeitungen {
    public static final Verarbeitung KEINE = (zutat) -> new VerarbeitetZutat(zutat.getName(), zutat.getAnzahl());
    public static final Verarbeitung SCHNEIDEN = (zutat) -> new VerarbeitetZutat("Geschnittene " + zutat.getName(), zutat.getAnzahl());
    public static final Verarbeitung WUERFELN = (zutat) -> new VerarbeitetZutat("Gewuerfelte " + zutat.getName(), zutat.getAnzahl());
 
    private Verarbeitungen() {
    }
}

Zum Beispiel. Aber wie gesagt, ohne Anforderung etwas schwer abzuschaetzen was genau man bauen soll.

Man kann die Verarbeitungen dann auch direkt einbetten:

Java:
rezept.add(new Zutat("Zwiebel", 1, (zutat) -> new VerarbeiteteZutat("Geschnittene " + zutat.getName(), zutat.getAnzahl())));

Also in erster Linie versucht man seine Datenhaltung und die Datenverarbeitung ein wenig von einander zu trennen. Halten von Daten ist immer einfach, da baut man sich dann ein POJO (Plain Old Java Object), also eine Klasse mit Gettern und Settern, und das verarbeiten lagert man dann irgendwo anders aus. Hier in dem Fall hat es Sinn gemacht jeder Zutat direkt den Verarbeitungsschritt mit zu geben, aber es kann auch durchaus denkbar sein dies erst (dynamisch) in der Schleife bei der Zubereitung aufzuloesen.

Also du willst quasi immer deine Verarbeitung soweit wegabstrahiert haben dass du diese relativ einfach erweitern, aendern oder austauschen kannst. Idealerweise wissen die Daten gar nichts von dem wie sie verarbeitet werden, geht sie ja nichts, und auszerdem wird sich das vermutlich ohnehin noch dreimal aendern oder erweitert werden. Von dem her koennte ich mir auch ein duales System vorstellen wo man Zutaten zusammen mit der Verarbeitung registriert im Rezept:

Java:
Rezept rezept = new Rezept("Etwas");
rezept.add(new Zutat("Zwiebeln", 5), Verarbeitung.WUERFELN);

Damit hast du dann die Zutat von der Verarbeitung komplett getrennt. Und idealerweise beziehst du die Zutaten aus einem Lagerraum:

Java:
Rezept rezept = new Rezept("Etwas");
rezept.add(lagerraum.hole("Zwiebeln", 5), Verarbeitung.WUERFELN);

Weil dann kann naemlich schon der Lagerraum einen Fehler werfen dass es nicht mehr genug Zwiebeln gibt.

Aber wie gesagt, ohne die Anforderung alles schwer zu sagen.
Naja, "objektorientierte Modellierung" ist halt biszchen anders als das was du machst. Naja dran, aber nicht ganz ideal.

Zuerst, kuerze keine Variablennamen ab nur weil du kannst, anz ist da ein gutes Beispiel, z ein noch viel schoeneres. Es macht den Code schwerer zu lesen und zu verstehen.

Das gesagt, du hast da ja die Zutat Klasse welche schon nahe d'ran ist, aber du mischt da noch die Verarbeitung als auch die Hauptlogik mithinein. Dein ZutatVerarbeiten ist auch kein richtiges "Zutat Verarbeiten", sondern mehr ein "Anzahl verarbeiten", und dass die Pruefung auf die Anzahl erst dort stattfindet ist vielleicht etwas spaet.

Also wenn man das etwas aufbereiten will:

Code:
Main.java
Zutat.java
ZutatVerarbeitung.java

Dann hat man in der Main.java die Hauptlogik vom Programm, Zutat tut nichts auszer Namen und Anzhal zu halten, und ZutatVerarbeitung wuerde die Zutat tatsaechlich verarbeiten. Jetzt ist hier aber das Problem dass wir die Anforderungen nicht kennen, also wir koennen dir gar nicht sagen wie man das wirklich geschickter aufbaut weil wir die Anforderungen nicht kennen. Demnach wuerde ich eher eine solche Struktur raten:

Code:
Main.java
Rezept.java
Zutat.java
VerarbeiteteZutat.java
Verarbeitung.java

Und jetzt folgt ein biszchen Pseudo-Code wie die Umsetzung aussehen koennte.

Java:
public static final class Main() {
    private Main() {
    }
  
    public static final void main(String[] arguments) {
        Rezept rezept = new Rezept("Etwas");
        rezept.add(new Zutat("Zwiebel", 1, Verarbeitungen.WUERFELN));
        rezept.add(new Zutat("Knoblauchzehen", 3, Verarbeitungen.SCHNEIDEN));
        rezept.add(new Zutat("Paprika", 2, Verarbeitungen.WUERFELN));
        rezept.add(new Zutat("Bohnen", 50, Verarbeitungen.KEINE));
     
        for (Zutat zutat : rezept.getZutaten()) {
            rezept.add(zutat.verarbeiten());
        }
      
        rezept.kochen();
    }
}

public interface Verarbeitung {
    public VerarbeiteteZutat verarbeiten(Zutat zutat);
}

public final class Verarbeitungen {
    public static final Verarbeitung KEINE = (zutat) -> new VerarbeitetZutat(zutat.getName(), zutat.getAnzahl());
    public static final Verarbeitung SCHNEIDEN = (zutat) -> new VerarbeitetZutat("Geschnittene " + zutat.getName(), zutat.getAnzahl());
    public static final Verarbeitung WUERFELN = (zutat) -> new VerarbeitetZutat("Gewuerfelte " + zutat.getName(), zutat.getAnzahl());
 
    private Verarbeitungen() {
    }
}

Zum Beispiel. Aber wie gesagt, ohne Anforderung etwas schwer abzuschaetzen was genau man bauen soll.

Man kann die Verarbeitungen dann auch direkt einbetten:

Java:
rezept.add(new Zutat("Zwiebel", 1, (zutat) -> new VerarbeiteteZutat("Geschnittene " + zutat.getName(), zutat.getAnzahl())));

Also in erster Linie versucht man seine Datenhaltung und die Datenverarbeitung ein wenig von einander zu trennen. Halten von Daten ist immer einfach, da baut man sich dann ein POJO (Plain Old Java Object), also eine Klasse mit Gettern und Settern, und das verarbeiten lagert man dann irgendwo anders aus. Hier in dem Fall hat es Sinn gemacht jeder Zutat direkt den Verarbeitungsschritt mit zu geben, aber es kann auch durchaus denkbar sein dies erst (dynamisch) in der Schleife bei der Zubereitung aufzuloesen.

Also du willst quasi immer deine Verarbeitung soweit wegabstrahiert haben dass du diese relativ einfach erweitern, aendern oder austauschen kannst. Idealerweise wissen die Daten gar nichts von dem wie sie verarbeitet werden, geht sie ja nichts, und auszerdem wird sich das vermutlich ohnehin noch dreimal aendern oder erweitert werden. Von dem her koennte ich mir auch ein duales System vorstellen wo man Zutaten zusammen mit der Verarbeitung registriert im Rezept:

Java:
Rezept rezept = new Rezept("Etwas");
rezept.add(new Zutat("Zwiebeln", 5), Verarbeitung.WUERFELN);

Damit hast du dann die Zutat von der Verarbeitung komplett getrennt. Und idealerweise beziehst du die Zutaten aus einem Lagerraum:

Java:
Rezept rezept = new Rezept("Etwas");
rezept.add(lagerraum.hole("Zwiebeln", 5), Verarbeitung.WUERFELN);

Weil dann kann naemlich schon der Lagerraum einen Fehler werfen dass es nicht mehr genug Zwiebeln gibt.

Aber wie gesagt, ohne die Anforderung alles schwer zu sagen.
Vielen Dank, Robert!
Ja, hier sieht man, dass ich noch viel zu lernen habe.
Gruß,
Cepheus
 

KonradN

Super-Moderator
Mitarbeiter
@KonradN Ich antworte nur auf Fragen, die auch gestellt wurden. Ansonsten hat der Fragende wohl ein Kompetenzproblem. 🤷‍♂️
Dann schau einfach noch einmal ganz genau in diesen Thread. Du hast auf keine Frage geantwortet. Du hast noch nicht einmal richtig gelesen, um was es im Detail geht.

Die Tatsache, dass Deine Aussage bezüglich
Mehr als 1 Parameter, müssen immer geklammert werden.
ist zwar sachlich korrekt aber hier einfach irrelevant, da eben nur ein Parameter bei der Lambda Expression vorkommt und nicht zwei.

Du hast also schlicht auf die richtige Antwort von @httpdigest geantwortet mit der Aussage:
Da sieht was faul aus... Das müsste sein: z.zubereiten((anz1, anz2) -> { if(anz1 <= ANZ_AUFLAGER) {...
und das ist schlicht falsch, denn
  • die Methode zubereiten benötigt zwei Parameter.
  • die Methode schneiden des Interfaces benötigt nur ein Parameter.

Du kannst hier also so viel herum trollen wie Du willst: Deine Aussage ist und bleibt falsch.

Wie man sieht, habe ich mit meiner Frage eine größere Diskussion ausgelöst.
Nein, keine Diskussion. Das würde ja den Austausch von Argumenten und ein Verständnis der Sachlage erfordern. Da scheitert es aber leider bei Tobias massiv, was schade ist.

Denk Dir nichts, das zwischen Konrad und Tobais ist hier schon etwas wie ein running Gag :) Sehr amüsant.
Naja - ist toll, dass Du es als running Gag ansiehst und amüsant findest. Ich finde es einfach nur peinlich. Tobias kann die Sticheleien nicht lassen - selbst in Threads, in denen er Hilfe erwartet. Jeder irrt sich mal. Jeder liest die Sachlage mal nicht gut genug. Aber wenn dann entsprechende Hinweise kommen, dann kann man da drauf eingehen. Und da stelle ich mir dann die Frage: Woran scheitert es bei Tobias? Ich habe dann extra noch die entscheidenden Java Ausschnitte gebracht in #7. Aber meine Erwartungshaltung, dass er da direkt erkennen würde, wie ein Lambda Ausdruck aussehen müsste und dass die Aufgerufene Methode zwei Parameter hat mit allen daraus notwendigen Schlußfolgerungen war wohl einfach viel zu hoch für unseren Forentroll.
 

KonradN

Super-Moderator
Mitarbeiter
Ja, hier sieht man, dass ich noch viel zu lernen habe.
Hier würde ich Dir gerne einen Tipp geben:

Es gibt ein Buch: "Entwurfsmuster von Kopf bis Fuß" (Übersetzung von "Head First Design Patterns") von Eric Freeman / Elisabeth Robson. In diesem Buch werden sehr grafisch die wichtigsten Entwurfsmuster erläutert.

So gehen mir bei Deinem Ansatz zwei mögliche Pattern durch den Kopf, die - je nach Aufgabenstellung - Sinn machen könnten:

Strategy Pattern
Bei dem Strategy Pattern wird ein Verhalten in eigenen Klassen abgebildet. In dem Buch wird das Beispiel "Ente" genommen. Eine Ente kann Quaken. Nur eben gibt es jetzt viele Arten von Enten: Das Tier Ente, die Holzente, eine Badeente, ... Jede Quakt anders. Die Ente hat also ein Quak-Verhalten. Und da gibt es dann diverse Implementierungen, die dann der Ente zugewiesen werden kann - je nach dem, welche Art von Ente man hat. (Mal ganz grob und einfach erläutert)

Decorator Pattern
Bei dem Decoration Pattern wird ein Klasse immer erweitert. So kannst Du eine Zutat haben. Diese könntest Du dann verändern. Im Rezept hast Du sowas wie:
  • Die Zutat (z.B. Zwiebel) wird gewürfelt
  • Dann wird die Zwiebel angebraten
  • Dann wird mit Wein abgelöscht
  • ....

Hier kann man das über das Dekorator Pattern alles abbilden. Dann hast Du die Zwiebel.
Die wird dann sozusagen gekapselt durch die Gewürfelte Zutat.
Das wird dann gekapselt durch das Angebratene Zutat
und so weiter.

In dem Buch wird das - so ich mich richtig erinnere - am Beispiel Pizzeria mit diversen Möglichkeiten bei Pizzen erläutert.

Diese Entwurfsmuster geben einem also ein interessantes Handwerksmaterial an die Hand, mit dem Du deine Möglichkeiten erweitern könntest.

Edit: Das Pattern heisst natürlich Decorator Pattern und nicht Decoration Pattern
 

M.L.

Top Contributor
noch viel zu lernen
Die bereits genannten Entwurfsmuster (inkl. Literatur) dienen dem Menschen ("Teile und herrsche") als Empfehlung (nicht als Gesetz) um das (häufige(re)) Ändern oder Erweitern der Software zu erleichtern. Weiters gibt es Stichworte wie "TDD", "(wie) mit Leuten reden", "Zettel und Stift","Namensgebung", "Aufteilung in Klassen", "Schichtentrennung" "people factor",,....

Den Compiler interessiert "nur" die formelle Korrektheit der Syntax (z.B. passende Anzahl an Parametern bei Funktionsaufruf, egal ob mit oder ohne Verwendung von Lambda-Ausdrücken)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
BeginnerJava "Weihnachtsbäume" anzeigen: Höhe als Parameter Java Basics - Anfänger-Themen 1
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
X Default Parameter Java Basics - Anfänger-Themen 20
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
J Bestimmte parameter aus Jsonfile auslesen Java Basics - Anfänger-Themen 15
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
H Warum kann man keine Parameter in die main-Methode packen? Java Basics - Anfänger-Themen 4
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
L Wie greife ich in der Subklasse auf die Parameter einer Methode der Superklasse zu ? Java Basics - Anfänger-Themen 15
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
J Apache Poi - createCell() Methode akzeptiert keinen Index aus for-schleife als Parameter Java Basics - Anfänger-Themen 4
P Parameter auf Datenformat überprüfen Java Basics - Anfänger-Themen 5
S Hamster Simulator rechnen lernen Parameter int Java Basics - Anfänger-Themen 6
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
W Parameter solange addieren bis 13 auftaucht Java Basics - Anfänger-Themen 11
L OOP Parameter mit der Draw-Methode übergeben Java Basics - Anfänger-Themen 11
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
L Methoden Übergabe von Parameter Java Basics - Anfänger-Themen 3
R Zu viele leere Parameter Java Basics - Anfänger-Themen 8
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
V Unbekannte Parameter Java Basics - Anfänger-Themen 1
J Input/Output Input als Parameter an Methoden übergeben Java Basics - Anfänger-Themen 23
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
A festgelegte Parameter Java Basics - Anfänger-Themen 11
PaperHat Methoden als Parameter anderer Methode verwenden Java Basics - Anfänger-Themen 11
D Interface Final für Parameter in überschriebenen Methoden? Java Basics - Anfänger-Themen 3
P Variablen Optionaler Parameter auf der Kommandozeile Java Basics - Anfänger-Themen 12
S Variable Parameter Java Basics - Anfänger-Themen 5
L Variablen Parameter bekommen Java Basics - Anfänger-Themen 13
M Methode mit Array als Parameter an Main übergeben Java Basics - Anfänger-Themen 1
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
B Webservice -> alle parameter bekommen von form Java Basics - Anfänger-Themen 2
K Klassenmethode mit übergebenen Parameter speichern Java Basics - Anfänger-Themen 7
I BigDecimal als Parameter verwenden Java Basics - Anfänger-Themen 3
J Parameter in main verwenden Java Basics - Anfänger-Themen 3
J Programm was üer Runtime.getRuntime gestartet wird erkennt String Parameter nicht Java Basics - Anfänger-Themen 0
G Int-Array im Konstruktor Parameter Java Basics - Anfänger-Themen 37
T Parameter das übergeben wurde ändern? Java Basics - Anfänger-Themen 1
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
P Operatoren Parameter nicht auf null geprüft? Java Basics - Anfänger-Themen 16
D Name eines JMenue als Parameter übergeben Java Basics - Anfänger-Themen 20
K Dynamischen Supplier für Parameter Java Basics - Anfänger-Themen 12
C Methoden Welche JSoup Methoden Und Parameter für diese HTML Tags Java Basics - Anfänger-Themen 4
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
W Methoden Methode ohne Parameter auf Instanz eines Objekts aufrufen? Java Basics - Anfänger-Themen 14
M Methode mit Parameter Java Basics - Anfänger-Themen 4
G Objektübergabe durch Parameter Java Basics - Anfänger-Themen 3
J Erste Schritte catch Exeption Parameter Java Basics - Anfänger-Themen 7
A Erste Schritte Methoden mit Parameter Java Basics - Anfänger-Themen 2
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
N Klassen Klassen zwingende Parameter mitteilen Java Basics - Anfänger-Themen 4
L Methoden Methode Parameter vertauschen? Java Basics - Anfänger-Themen 3
C Auswertung Ausdruck mit Punknotation + Objekt als Parameter Java Basics - Anfänger-Themen 3
A Methoden Parameter optionalisieren möglich? - Wie? Java Basics - Anfänger-Themen 19
N Beliebig viele parameter Java Basics - Anfänger-Themen 3
F Methoden: Referenzvariable als Parameter Java Basics - Anfänger-Themen 4
J HttpGet Parameter mitgeben Java Basics - Anfänger-Themen 5
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
T Klasse von erfahren wenn Obertyp Parameter ist Java Basics - Anfänger-Themen 6
J Klassen Fehler mit Parameter des Konstruktors bei einer Objekterzeugung Java Basics - Anfänger-Themen 5
V Parameter in synchronized-Blöcken verstehen Java Basics - Anfänger-Themen 2
M Klasse als Parameter übergeben Java Basics - Anfänger-Themen 7
S Methoden eine Instanz einer eigenen Klasse als parameter übergeben Java Basics - Anfänger-Themen 9
T unterschiedlich viele parameter übergeben Java Basics - Anfänger-Themen 5
V Methoden key value Parameter Java Basics - Anfänger-Themen 11
J Drucker parameter ändern Java Basics - Anfänger-Themen 9
F trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 0
O Basisklassen als Methoden-Parameter ähnlich, wie in C++ ? Java Basics - Anfänger-Themen 6
D GregorianCalendar als Parameter Java Basics - Anfänger-Themen 2
M Parameter von Konstruktor, der Superklassen-Konstruktor aufruft Java Basics - Anfänger-Themen 2
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
O ArrayListe sortieren anhand zweier Parameter Java Basics - Anfänger-Themen 4
S Methoden Rückgabewert einer Methode als Parameter an eine andere Methode übergeben, geht das? Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
T In main-Methode Parameter übergeben Java Basics - Anfänger-Themen 3
M Methode als Parameter übergeben Java Basics - Anfänger-Themen 16
Joew0815 Methoden Objekt als Methoden-Parameter - Kein call-by-reference? Java Basics - Anfänger-Themen 12
T Parameter in Eigner Konsole Java Basics - Anfänger-Themen 2
ElfterDoktor Einen Objekt Attribute/Parameter geben & Auslesen Java Basics - Anfänger-Themen 4
R Erste Schritte Unterschied Array-Parameter zu Array als Parameter? Java Basics - Anfänger-Themen 7
HoloYoitsu args-Parameter durchschleifen (Schnittstelle erweitern?) Java Basics - Anfänger-Themen 27

Ähnliche Java Themen

Neue Themen


Oben