Polymorphie Funktion als Parameter

G

G12112012

Gast
Grüße zusammen!

Ich arbeite grade an einem Projekt in Java, und dabei benötige ich eine Möglichkeit eine Art Callback Mechanismus zu implementieren.

Ganz einfach umschrieben:
Ich habe ein paar Parameter. Für diese Parameter habe ich eine Funktion die irgendwas mit ihnen macht. Der Haken ist dass ich eine Möglichkeit suche um eine neue Funktion auf diesen Parameter laufen zu lassen, und zwar anstelle der alten Funktion. Die Idee wäre jetzt eine Funktion als Parameter mitzugeben die dann auf die Parameter angewendet wird.

Mir wurde gesagt sowas nennt man Callback und das würde in Java mit "Functors" gehen. Ich habe dazu gegooglet aber die Beispiele verwirren mich ehrlich gesagt nur.

Ich bin in Java eher Einsteiger und in anderen Sprachen wenn eher noch weniger bewandert.

Könnte mir jemand ein ganz simples Beispiel geben wie man sowas umsetzen kann?
 
N

nillehammer

Gast
Die "Funktion" kann man in Java (anders als in anderen Sprachen) nicht direkt übergeben. Was man aber machen kann, die gewünschte Methode mit return-Value und Parametern in einem Interface definieren. Stellen wir uns also eine Methode vor, die drei String-Parameter entgegennimmt "irgendwas" damit macht und einen String zurück gibt. Als Interface sähe das dann so aus:
Java:
// Das ist Deine "Callback-Funktion". Durch Verwendung eines Interfaces
// machst Du sie austauschbar.
public interface StringProcessor {

   public String process(String str1, String str2, String str3);
}
Jetzt soll die Funktion mit Leben gefüllt werden. Dazu brauchen wir Implementierungen des Interfaces. Wenn es reine Service-Methoden sind, die nur auf ihren Parametern arbeiten, mach ich das gerne mit enums, geht aber natürlich auch mit Instanzen von Klassen:
Java:
// Der Implementierungscode ist zugegebenermaßen weder schön noch sinnvoll.
// Es geht hier nur um die Erklärung des Prinzips
public enum StringProcessorImpls implements StringProcessor {

  CONCAENATOR {

    @Override
    public final String process(String str1, String str2, String str3) {

      return str1 + str2 + str3;
    }
   },
   FIRST_LAST {
          @Override
    public final String process(String str1, String str2, String str3) {

      return str1 + str3;
    }
  }
}
Mit den verschiedenen Implementierungen hast Du jetzt eine Auswahl von process-"Funktionen". Das ist so eine Art call-back (finde den Begriff nicht sehr passend, aber egal). Verwenden tust Du es dann so:
Java:
public static String processThree(String str1, String str2, String str3, StringProcessor sp) {
  // Hier wird die process-Methode des Interfaces aufgerufen
  // Wie dese tatsächlich funktioniert (welche "Funktion" sich dahinter verbirgt)
  // wird durch die Implementierung festgelegt, die der caller übergibt.
  return sp.process(String str1, String str2, String str3);
}

...
// Hier wird eine Implementierung übergeben, die zu einer konkatonierung führt
processThree("erster", "zweiter", "dritter", StringProcessorImpls.CONCATENATOR);

// Hier wird andere Implementierung übergeben, die zu einer konkatonierung von
// first und last führt.
processThree("erster", "zweiter", "dritter", StringProcessorImpls.FIRST_LAST );
Wie gesagt, der Code ist weder schön noch sinnvoll, aber so schaffst Du es verschiedene Funktionen in eine andere Methode zu bringen und sie dort zu benutuzen.
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Öhm... das mit den enums würde ich so nicht direkt empfehlen... Man kann sich z.B. eine eigene Klasse erstellen
Java:
public class ConcatStringProcessor implements StringProcessor {
   @Override
   public String process(String str1, String str2, String str3) { return ... }
}
oder besser die Implementierung verstecken und sich sowas von einer Methode liefern lassen - dann z.B. auch einfach als anonyme Klasse, wenn's ein Einzeiler ist:
Java:
class StringProcessors
{
    public static StringProcessor concatenating()
    {
        return new StringProcessor()
        {
           @Override
           public String process(String str1, String str2, String str3) { return ... }
        };
    }
}
 
N

nillehammer

Gast
Marco13 hat gesagt.:
Öhm... das mit den enums würde ich so nicht direkt empfehlen...
Da bin anderer Meinung. Unter bestimmten Voraussetungen finde ich die verwendung Enums als Interface-Implememtierung seeehr sinnvoll (Comparator- und Filter-Implementierungen mache ich fast immer so). Können wir gerne diskutieren (vielleicht in einem anderen Thread?)
Marco13 hat gesagt.:
oder besser die Implementierung verstecken und sich sowas von einer Methode liefern lassen
Da widerrum stimme ich Dir zu. Code, der direkt die Enum als Implementierung veröffentlicht, wirst Du in von mir erstelltem Produktivcode auch nicht finden. Das geht immer über package private Impls und dann Factories oder DI-Module. Ich wollte aber nicht mehr Code schreiben, als nötig war, um das Prinzip "Callback-Interface" zu erklären.
 
Zuletzt bearbeitet von einem Moderator:
G

G12112012

Gast
Ich danke euch, ihr habt mir sehr geholfen! Jetzt macht das ganze schon wesentlich mehr Sinn.
 

mvitz

Top Contributor
Da bin anderer Meinung. Unter bestimmten Voraussetungen finde ich die verwendung Enums als Interface-Implememtierung seeehr sinnvoll (Comparator- und Filter-Implementierungen mache ich fast immer so). Können wir gerne diskutieren (vielleicht in einem anderen Thread?)

Da widerrum stimme ich Dir zu. Code, der direkt die Enum als Implementierung veröffentlicht, wirst Du in von mir erstelltem Produktivcode auch nicht finden. Das geht immer über package private Impls und dann Factories oder DI-Module. Ich wollte aber nicht mehr Code schreiben, als nötig war, um das Prinzip "Callback-Interface" zu erklären.

Hat vor allem den Vorteil, dass man bei Funktionen, wie "alwaysTrue", etc. sich das implementieren von Equals spart ;-) (das macht sogar Gooogle Guava für diese Funktionen so).
 

Marco13

Top Contributor
@nillehammer: Wenn man es sowieso versteckt, besteht auch kein Grund mehr, es als enum zu schreiben (aber genaugenommen auch keiner, das NICHT zu tun, deswengen ... :bahnhof: ;) )
 
B

bygones

Gast
mit enums erspart man sich die Factory, die man sonst anbieten wuerde um die Implementierungen zu verstecken.

bei enums bekommt man halt noch zusatzfunktionen, die man vielleicht nicht unbedingt haben muss, wie values() oder valueOf(). Bei konstanten implementierungen machen diese nicht sehr viel sinn imho.

Von daher finde ich erstmal eine simple Factory besser.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Funktion als Parameter einer anderen Funktion Allgemeine Java-Themen 5
M Funktion als Parameter oder andere Möglichkeit Allgemeine Java-Themen 3
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
S Validation Annotation Funktionsparameter vs Funktion vs Attribut Allgemeine Java-Themen 0
R Variablen String mit split-Funktion aufteilen Allgemeine Java-Themen 7
A Serialize - Add Funktion Allgemeine Java-Themen 1
B Discord Bot - Funktion wird nicht aufgerufen Allgemeine Java-Themen 1
A Variablen Funktion übergibt den Wert nicht Allgemeine Java-Themen 13
J Überschriebene Funktion soll nicht die super Funktion aufrufen Allgemeine Java-Themen 4
Aruetiise Funktion(y = mx+n) in String speichern und berechnen Allgemeine Java-Themen 9
B Hilfe!! spiel um Funktion des Selektierens erweitern (mit ASCII-Tabelle) Allgemeine Java-Themen 3
MiMa ArrayList Rückgabewerte aus einer Funktion Allgemeine Java-Themen 15
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
A Plot funktion applet Allgemeine Java-Themen 4
S Methoden "Unschöne" Break-Anweisung aus verschachtelter Funktion entfernen Allgemeine Java-Themen 11
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
T Best Practice MD5 Funktion Allgemeine Java-Themen 9
perlenfischer1984 Testng : Funktion mit mehreren Parametern testen Allgemeine Java-Themen 5
L Stack overflow bei einer endrekursiven Funktion (Anwendung: Spezialform des Package Merge) Allgemeine Java-Themen 4
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
O JNA Zugriff auf Funktion aus DLL Allgemeine Java-Themen 0
Lord.Djerun (Taschenrechner) jButtons mit gleicher Funktion zusammenfassen Allgemeine Java-Themen 6
I Javafx Open/Read und Tree Funktion Allgemeine Java-Themen 14
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
F Classpath als Argument in Funktion übergeben Allgemeine Java-Themen 3
H SHA256 update-Funktion Allgemeine Java-Themen 3
J Methoden Abgeänderte Fibonacci Funktion Allgemeine Java-Themen 2
F Funktion nur in einem Zeitraum Allgemeine Java-Themen 5
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
M Anzahl der Durchläufe einer Funktion errechnen Allgemeine Java-Themen 6
J Autofill Funktion Uhrzeit Allgemeine Java-Themen 19
G Timeout funktion zu einer Eventlogabfrage Allgemeine Java-Themen 2
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
K Warum wartet diese Funktion auf beenden des Threads? Allgemeine Java-Themen 3
N JNI Callback Funktion Allgemeine Java-Themen 8
D Problem bei der Darstellung einer trigonometrischen Funktion Allgemeine Java-Themen 2
E Funktion sperren bis Unterfunktionen ferig sind Allgemeine Java-Themen 3
D Referenz einer Funktion aus einer anonymen Klasse? Allgemeine Java-Themen 3
J Funktion zu einer Uhrzeit/datum ausführen Allgemeine Java-Themen 4
S eigene Update Funktion Allgemeine Java-Themen 5
Ark Name für Funktion gesucht Allgemeine Java-Themen 5
Screen Eine mathematische Funktion als Argument für eine Methode - Matheparser? Allgemeine Java-Themen 21
Daniel_L Bug in Copy-Funktion bei HTML-Editorpane? Allgemeine Java-Themen 4
multiholle Aufrufer einer Funktion ermitteln Allgemeine Java-Themen 13
W JMF- Player.getDuration() Funktion spinnt Allgemeine Java-Themen 2
C JTextComponent - mit Schlagwörter Funktion aufrufen Allgemeine Java-Themen 2
SuperSeppel13 php-funktion aufrufen Allgemeine Java-Themen 5
M get Funktion von Vector Allgemeine Java-Themen 4
V Wie Enum an Funktion "übergeben" ? Allgemeine Java-Themen 4
G Webserver Funktion Allgemeine Java-Themen 3
S Random funktion in einer Grafischen Oberfläche Allgemeine Java-Themen 10
C Funktion stoppt alles Allgemeine Java-Themen 7
G Funktion aus array aufrufen Allgemeine Java-Themen 16
P Funktion vorhanden - wie auf Transitivität erweitern? Allgemeine Java-Themen 6
lumo Row Header ist public, zeigt die funktion aber nicht public Allgemeine Java-Themen 8
P Unterschied zwischen Funktion und Methoden Allgemeine Java-Themen 3
B E-Funktion mit Java Allgemeine Java-Themen 9
S verstehe diese Funktion nicht Allgemeine Java-Themen 6
S Referenz auf Funktion? Allgemeine Java-Themen 16
K Funktion unabhängig vom Namen aufrufen Allgemeine Java-Themen 5
F Vorteile -> Funktion Allgemeine Java-Themen 2
P gegenstück zur php funktion gzinflate()? Allgemeine Java-Themen 3
D Problem bei Aufruf einer Funktion Allgemeine Java-Themen 3
J Welche Daten für Ative-X Funktion? Allgemeine Java-Themen 5
X Replay Funktion realisieren? Allgemeine Java-Themen 5
J Funktion alle Möglichkeiten berücksichtigen Allgemeine Java-Themen 5
P DLL Funktion benutzen Allgemeine Java-Themen 3
S Fortran Funktion mit JNI aufrufen: java.lang.UnsatisfiedLink Allgemeine Java-Themen 2
T Pipe-Funktion - Prozente falsch? Allgemeine Java-Themen 8
A undo funktion in Malprogramm Allgemeine Java-Themen 15
J Method.invoke -> Exceptions der Funktion abfangen Allgemeine Java-Themen 5
M Frage zu resume funktion bei downloadmanager Allgemeine Java-Themen 7
M Funktion liest nach Textaus aus der vorigen Zeile Allgemeine Java-Themen 2
G nichtabstrakte Funktion zu einer Interface hinzufügen Allgemeine Java-Themen 6
M Funktion des JRE Allgemeine Java-Themen 8
B Nach Deserialisieren: Elemente des JFrames ohne Funktion Allgemeine Java-Themen 5
A funktion schiffeZeichnen zwei mal aufrufen Allgemeine Java-Themen 16
P Suche String Tutorial zu Suche&Ersetze Funktion von text Allgemeine Java-Themen 35
D Mathematische Funktion grafisch in Java darstellen Allgemeine Java-Themen 2
7 Gibts in Java ne Funktion, die ein ganzes Array ausgibt Allgemeine Java-Themen 11
L sin cos funktion Allgemeine Java-Themen 5
L return-Funktion Allgemeine Java-Themen 5
L return Funktion Allgemeine Java-Themen 6
H Funktion aus einer anderen Klasse ausführen Allgemeine Java-Themen 3
TRunKX Gibt es ne fertige Java Funktion die Dateien vergleicht? Allgemeine Java-Themen 4
M Funktion wird nicht durchlaufen. Allgemeine Java-Themen 13
G Bilder zeichnen und Zoom Funktion Allgemeine Java-Themen 2
G java funktion in JSP file aufrufen. Allgemeine Java-Themen 2
K funktion aus einem String aufrufen Allgemeine Java-Themen 9
L C# Funktion in Java aufrufen Allgemeine Java-Themen 4
thE_29 Funktion mit Funktionaufrufen Allgemeine Java-Themen 4
G Funktion, die langsam wächst Allgemeine Java-Themen 7
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 2
F KI / Machine Learning Parameter verschachtelte for Schleifen Allgemeine Java-Themen 1
8u3631984 Funktions Parameter mit Lombok "NonNull" annotieren wird in Jacococ Testcoverage nicht herausgefiltert Allgemeine Java-Themen 3
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
M Datensatz auf ein bestimmten Parameter einzugrenzen Allgemeine Java-Themen 11
B JAX - RS.... Multiple parameter application/x-www-form-urlencoded.... Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben