Kann man eine Methode als Variable speichern und danach noch verändern?

AlexBexD

Mitglied
Hallo, meine Frage ist vielleicht etwas schwierig zu erklären.
Ich möchte eine Methode in einer Variable speichern, um sie Später wieder abzurufen!

Ich weiß das man das so machen kann,
Code:
public void test(String s) { System.out.println(s) }
allerdings möchte Ich den Inhalt der Methode im nachhinein verändern können,
ungefähr wie im folgenden Beispiel
Code:
test() = new void(String s){ System.out.println(s); };

Falls jemand Fragen hat oder mein vorhaben nicht richtig versteht kann gerne Fragen!

Ich freue mich über alle Lösungsvorschläge!
 
K

kneitzel

Gast
Man kann eine Methode in einer Variablen speichern. Da hier Parameter übergeben werden aber nichts zurück gegeben wird, wurde dies Consumer genannt (Das übergebene wird konsumiert :) ).

Code kann dann z.B. wie folgt aussehen:
Java:
import java.util.function.Consumer;

public class Test {
    public static void main (String[] args) {
        Consumer<String> consumer;
        
        consumer = System.out::println;
        consumer.accept("Ausgabe!");
        
        consumer = s -> System.out.println("Hallo " + s);
        consumer.accept("Du");
    }
}

Also erst wird ein Consumer deklariert, der ein String Argument übergeben bekommt.
Dann wird der erst einmal auf die Method println von System.out gesetzt, so dass man beim Aufruf mittels accept "Ausgabe!" ausgegeben bekommt.
Dann setze ich das noch einmal um auf eine anonyme Funktion (Lambda Ausdruck), in der einfach "Hallo " + Argument ausgegeben wird, so dass dann im folgenden Aufruf "Hallo Du" ausgegeben wird.
 

AlexBexD

Mitglied
Hey, danke für die Antwort, mit einem Consumer kann Ich schon etwas mehr Anfangen,

aber währe es möglich bei einem Consumer mehrere Zeilen bzw. "aufgaben" zu machen?

und meine Frage war vielleicht etwas kompliziert ausgedrückt,
Ich würde im Prinzip gerne Wissen ob man eine vorhandene Methode überschreiben bzw. den Inhalt neu festlegen kann.
wie im diesem Beispiel:
Code:
myVoid() = { System.out.println("test") }
 
K

kneitzel

Gast
Erst einmal etwas, das mir noch vor Deiner Antwort eingefallen ist - das Strategy Pattern. Das habe ich jetzt erst noch einmal zu Ende geschrieben, auch wenn es nicht auf Deine Antwort eingeht!

Was man in diesem Zusammenhang evtl. auch erwähnen sollte ist das Strategy Pattern. Das sollte man auf jeden Fall auch auf dem Schirm haben in solchen Situationen.

Beispiel aus head first design patterns ist die Ente, die ein Verhalten fürs fliegen und quaken hat.
Aber Enten gibt es viele, so z.B. neben der lebenden Ente noch die Badeente (kann nicht fliegen aber einen Quietsch Laut machen) oder die Holzente (kann weder fliegen noch Laute von sich geben).

Die Idee bei dem Pattern ist nun, dass die Ente ein Feld für das jeweilige Verhalten bekommt. Es gibt also ein Interface für das Fliegen und ein ein Interface für das quaken. Und davon leiten dann die jeweiligen Verhalten ab.

Auf Deine Frage bezogen bedeutet das, dass Du nicht eine Funktion setzt wie in meiner ersten Antwort, sondern Du nutzt ein Interface. Also in Deinem Fall ein Interface, das einfach nur eine Methode definiert.

Das Beispiel von oben etwas vereinfacht sieht dann wie folgt aus:
Interface:
Java:
package functiontest;

public interface ActionInterface {
    void doAction(String something);
}

Eine Implementierung:
Java:
package functiontest;

public class HelloOutputAction implements ActionInterface {
    public void doAction(String s) {
        System.out.println("Hello " + s);
    }
}

Das Beispiel von der ersten Antwort könnte dann wie folgt aussehen:

Java:
package functiontest;

import java.util.function.Consumer;

public class Test {
    public static void main (String[] args) {
        ActionInterface action;

        action = new ActionInterface() {
            @Override
            public void doAction(String something) {
                System.out.println(something);
            }
        };
        action.doAction("Ausgabe!");
        
        action = new HelloOutputAction();
        action.doAction("Du");

        Consumer<String> consumer;

        consumer = System.out::println;
        consumer.accept("Ausgabe!");

        consumer = s -> System.out.println("Hallo " + s);
        consumer.accept("Du");
    }
}

https://www.philipphauer.de/study/se/design-pattern/strategy.php
 
K

kneitzel

Gast
Hey, danke für die Antwort, mit einem Consumer kann Ich schon etwas mehr Anfangen,

aber währe es möglich bei einem Consumer mehrere Zeilen bzw. "aufgaben" zu machen?

und meine Frage war vielleicht etwas kompliziert ausgedrückt,
Ich würde im Prinzip gerne Wissen ob man eine vorhandene Methode überschreiben bzw. den Inhalt neu festlegen kann.
wie im diesem Beispiel:
Code:
myVoid() = { System.out.println("test") }

Also mehrere Zeilen bei einem Consumer ist kein Thema, denn Du kannst zum einen eine andere Funktion angeben (So wie bei dem System.out::println) und zum anderen kannst Du in einem Lambda auch einen Block nutzen, also sowas wie s -> { ... } .

Eine Funktion überschreiben geht so einfach erst einmal nicht. Hier gibt es aber auch Möglichkeiten, die z.B. bei der Aspekt Orientierten Entwicklung eingesetzt werden.
Da werden dann zum einen Proxy Objekte geschaffen, die gewisse Dinge machen... also angenommen, man hat eine Klasse Test, die nur eine Methode test hat, dann könnte ein Proxy so aussehen:

Java:
public class TestProxy extends Test {
    Test instance;

    public TestProxy(Test instance) {
        this.instance = instance;
    }

    public void test() {
        // Do something before call.
        instance.test();
        // Do something after call.
    }
}
Und zum anderen wird dann auch Bytecode angepasst. Der Code, der also mit der Klasse Test arbeitet, wird angepasst, so dass da immer der Proxy erstellt und genutzt wird.

Also da wo Du ein new Test() hast, wird ein new TestProxy(new Test())) raus.

Das dient dann um sogenannte Aspekte zu haben. Das sind dann Dinge, die z.B. vor oder nach einem Aufruf einer Methode gemacht werden sollen.

Das Ganze ist hier natürlich nur extrem vereinfacht dargestellt worden. Da kommt einiges mehr mit rein.

Was man sich hier ansehen kann und was Du evtl. nutzen willst, ist cglib: https://github.com/cglib/cglib/wiki
Das kann so Proxies erstellen und gewisse Dinge machen.

Ansonsten wenn es auch noch um Bytecode manipulation geht:
ASM: https://asm.ow2.io/

Und so Dich AOP interessieren sollte (weil ich es erwähnt habe): AspectJ ist ein AOP Framework: https://www.eclipse.org/aspectj/

Aber: Ich würde hier den Einsatz genau prüfen! Nicht, dass Du eine Sache unnötig verkomplizierst und so!
Das eigentliche Problem hast Du nicht genannt und daher fürchte ich etwas, dass wir hier eventuell ein xy Problem haben! Das Pattern ist im Software Design üblich und wenn das Overkill scheint: dann hat man den Consumer oder die Function, wenn man eine Rückgabe braucht....

Ich hoffe, dass dir dies etwas geholfen hat.

Edit: Hatte nicht mitbekommen, dass Du schon geantwortet hast. Schön, dass ich Dir etwas weiterhelfen konnte. Den Ausflug in die Proxies und Bytecode Manipulation kannst Du dann getrost ignorieren :)
 

mihe7

Top Contributor
Man könnte noch anführen, dass man komponierte Funktionen/Consumer erstellen kann:
Java:
import java.util.function.Consumer;

public class Test {
    public static void main(String[] args) {
        Consumer<String> output = printName().andThen(printLength()).andThen(newLine());
        output.accept("Hans");
        output.accept("Dampf");
    }

    private static Consumer<String> printName() {
        return s -> System.out.print("Dein Name '" + s + "' ");
    }

    private static Consumer<String> printLength() {
        return s -> System.out.print("ist " + s.length() + " Zeichen lang");
    }

    private static Consumer<String> newLine() {
        return s -> System.out.println();
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Wie erstelle ich eine Vorbedingung für eine Variable einer Methode ? Java Basics - Anfänger-Themen 5
H Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? Java Basics - Anfänger-Themen 2
P Variablen Wie kann ich eine lokale Variable in eine andere Methode einfügen? Java Basics - Anfänger-Themen 27
B auf private Variable durch eine Methode zugreifen Java Basics - Anfänger-Themen 8
D Von einer Methode auf eine lokale Variable in der Main zugreifen? Java Basics - Anfänger-Themen 15
E Variable aus einer Methode heraus in eine andere Klasse übergeben Java Basics - Anfänger-Themen 13
A Wert einer Variable an eine Methode in einer anderen Klasse. Java Basics - Anfänger-Themen 4
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
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
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
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
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
M Wie lang eine Funktion/Methode? Java Basics - Anfänger-Themen 51
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
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
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
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
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
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
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
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