Referenz auf Funktion?

Status
Nicht offen für weitere Antworten.
S

Samuel

Gast
Ich konnte nichts genaures finden, aber schlecht gesucht ist immer eine Möglichkeit, daher frag ich zur sicherheit.

Ist es möglich in Java eine Referenz auf eine Funktion zu haben?
 
G

Guest

Gast
Nur über Reflection. Wenn du sowas wie die Delegates in C# suchst, dann findest du in Java nichts vergleichbares.
In Java löst man es eher durch Interfaces (Callback, Functor, Visitor).
 
S

Samuel

Gast
Ich such einen weg generisch eine Methode aufzurufen, ohne zu wissen welche Methode dies nun ist, quasi aus einem Pool von Methoden mit der gleichen Signatur nur mit einem anderen Namen
 

Jango

Gesperrter Benutzer
Delegates haben damit nichts zu tun. Die sind alle 'gebunden'.
Was du suchst, sind Generics (vergleichbar mit den 'Templates' von C++). Sie ermöglichen den Zugriff (zur Laufzeit) auf Datentypen, die zur Kompilierzeit noch nicht bekannt sind (Klassen, Strukturen, Schnittstellen (Interfaces) und Methoden).
Ich denke Java verfügt jetzt auch über Generics, weil doch sehr viel von C# abgeschaut wurde.
Such mal in der Richtung. :)
 
S

Samuel

Gast
Hallo,
ich weiß was generics sind, und die sind ja schon seit 1.5 mitbei, aber ich sehe den Zusammenhang zwischen generischen Methoden und Methoden Referenzen.
Generische Methoden ermöglichen zur Kompilierzeit unbekannte Rückgabewerte von Methode A, ich hab aber Methode A,B,C die ich einheitlich aufrufen will, ohne irgendwelche if Bedingungen oder ähnliches. Quasi
ref = methodeA
rufe ref auf
ref = methodeB
rufe ref auf.
Das ist vereinfacht, ziel ist es zu vermeiden noch Variablen über Zustände zu haben, wenn man direkt den Zustand nutzen kann (also die jeweilige Methode)
 
G

Guest

Gast
Wie ich schon schrieb, über Reflection geht es.
Schau dir die Klassen Class und Method an. Du kannst alle Methoden einer Klasse ermitteln und auch
alle Parameter der Methoden. Wenn du dir eine Art Signaturklasse baust, kannst du zu jedem beliebigen
Objekt nach Methoden mit der gewünschten Signatur suchen. Das brauchst du pro Klasse nur einmal
zu machen (intern einen Cache halten Class->Signatur) und beliebig oft wiederverwenden.
 

ARadauer

Top Contributor
Ist es möglich in Java eine Referenz auf eine Funktion zu haben?
Ich verwende da immer das Command Pattern. Ich hab ein Interface, mit der Methode excecute und dann kann ich mir Commandos erstellen, die die entsprechende Methode über excecute ausführen.

Pool von Methoden mit der gleichen Signatur nur mit einem anderen Namen
passt doch perfekt, oder? eine Faktory die Commands zurück liefert
 

Leroy42

Top Contributor
Gar nicht!

Code:
interface ExecI {public void exec();}
class E1 implements ExecI {public void exec() {System.out.print("Hallo ");}}
class E2 implements ExecI {public void exec() {System.out.print("Welt");}}

...
ExecI ex;
ex = new E1(); ex.exec();
ex = new E2(); ex.exec();
 
S

Samuel

Gast
N bisschen umständlich für 3 Methoden extra drei Klassen anzulegen, findest du nicht?

Und ich kenne dies nicht als Command pattern, sondern als simple polymorphie :D
 
S

SlaterB

Gast
es geht auch anonym:

ExecI ex;
ex = new ExecI() {
public void exec() {System.out.print("Hallo ");}
};
ex.exec();

und wenn die Alternative Reflection heißt, dann verbietet es sich, das Wort 'umständlich' zu benutzen ;)
 
B

Beni

Gast
Samuel hat gesagt.:
Ich glaub ein Swith mit einem Enum ist wohl doch besser
Nur wenn du schon beim Compilieren alle Methoden kennst, die möglicherweise aufgerufen werden. Normalerweise ist der Weg mit den Interfaces flexibler, und damit im Endeffekt auch einfacher.
 
S

Samuel

Gast
Naja, das kann man sicherlich sehen, wie man will.
Ich finde es zum Beispiel nicht einfacher.
Ich habe drei Methoden in einer Klasse, diese nutzen Member der eigenen Klasse und bilden eine Objekteinheit.
Wenn ich die drei Methoden nun in Pseudoklassen werfe, muss ich denen auch noch Parameter übergeben, will ich was ändern, muss ich die Signaturen der Methoden, des Interfaces, des Aufrufs und der Implementierung ändern. Wenn die Methoden in der Klasse ändere, so muss ich nur deren Implementierung ändern und sonst nichts...
 
G

Guest

Gast
Hier eine kleine "Skizze", wie ich es oben mit der Signaturklasse gemeint habe.
Code:
public class Signature<TResultType>
{
   private Class<?> signature[];

   public Signature(Class<?> ... signature)
   {
      // Parameter prüfen (null als Klasse macht keinen Sinn, siehe *1)
      this.signature = signature;
   }

   public TResultType invoke(Object target, Object ... arguments)
   {
      ... Null-Check, Parameter-Check, Methode ermitteln, Ausführen
   }

   public boolean isApplicableTo(Object obj)
   {
      ... Null-Check, Methode ermitteln
   }

   ... interner Cache für die Signaturen bereits bekannter Klassen.
}
Verwendung
Code:
// *1 Signature<Void> s0 = new Signature<Void>(null); <-- Nicht zulassen
Signature<Void> s1 = new Signature<Void>(Integer.class);
Signature<Long> s2 = new Signature<Long>(Integer.class, String.class);
Signature<Void> s3 = new Signature<Void>();

Object obj1 = Class.forName("was.auch.Immer").newInstance();
Object obj2 = new Foo();

s1.invoke(obj1, 1);
s1.invoke(obj2, 2);

if(s2.isApplicableTo(obj1))
{
   Long result = s2.invoke(obj1, 1, "Test");
}

if(s3.isApplicableTo(obj2))
{
   s3.invoke(obj2);
}
 

byte

Top Contributor
Samuel hat gesagt.:
Ich habe drei Methoden in einer Klasse, diese nutzen Member der eigenen Klasse und bilden eine Objekteinheit.
Wenn ich die drei Methoden nun in Pseudoklassen werfe, muss ich denen auch noch Parameter übergeben, will ich was ändern, muss ich die Signaturen der Methoden, des Interfaces, des Aufrufs und der Implementierung ändern. Wenn die Methoden in der Klasse ändere, so muss ich nur deren Implementierung ändern und sonst nichts...
Nein. Du musst das Interface bloß anonym in der Klasse implementieren.
Wenn Du Dich mit Interfaces aber nicht anfreunden willst, dann rate ich Dir die Sprache zu wechseln. Denn Interfaces stellen ein - wenn nicht das - zentrale Konzept in Java dar.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Referenz einer Funktion aus einer anonymen Klasse? Allgemeine Java-Themen 3
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
MiMa Referenz auf Objekte und deren Inhalte Allgemeine Java-Themen 12
kodela Übergabe einer Referenz Allgemeine Java-Themen 20
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
M Compiler-Fehler Methoden-Referenz Allgemeine Java-Themen 5
S OOP this-Referenz als Konstruktor-Übergabe Allgemeine Java-Themen 8
M neues Objekt speichern, nicht Referenz Allgemeine Java-Themen 10
Y POI auf eine Referenz (Datei/Internetseite) anwenden Allgemeine Java-Themen 9
B Speicherverbrauch Objekt-Referenz Allgemeine Java-Themen 11
P Threads ohne Referenz & der Garbage Collector Allgemeine Java-Themen 2
K Als Rückgabewert ode call by referenz was ist sauberer? Allgemeine Java-Themen 12
A Observer Pattern: feuern bei neuer Referenz-Zuweisung? Allgemeine Java-Themen 8
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
T Interface-Referenz Allgemeine Java-Themen 2
K ArrayList Referenz Allgemeine Java-Themen 8
MQue this- Referenz Allgemeine Java-Themen 4
G referenz von variablen Allgemeine Java-Themen 9
T Referenz und GC? Allgemeine Java-Themen 16
T JNI Referenz auf Variable in Java? Allgemeine Java-Themen 2
MQue Datei- referenz schließen Allgemeine Java-Themen 5
P call by value/referenz Allgemeine Java-Themen 4
S Stream ohne Referenz kopieren ? Allgemeine Java-Themen 4
G Referenz und Garbagecollector Allgemeine Java-Themen 4
D Map: Referenz oder Int-ID als key speichern? Allgemeine Java-Themen 11
M Stil-Frage: this-Referenz Allgemeine Java-Themen 38
B wird Vektor als Referenz übergeben? Allgemeine Java-Themen 5
G 2 Objekte der selben Klasse zusammenfügen und alte Referenz Allgemeine Java-Themen 19
V Übergabe per Referenz. Allgemeine Java-Themen 5
G Eine C/C++ Referenz in einem Java Object speichern Allgemeine Java-Themen 5
G Referenz auf Variable! Allgemeine Java-Themen 3
F array als referenz/werteparameter übergeben? Allgemeine Java-Themen 2
M Referenz wird nicht überschrieben? Allgemeine Java-Themen 2
C GC: Referenz entfernen Allgemeine Java-Themen 6
K Referenz löschen Allgemeine Java-Themen 3
T Exception im Constructor -> null-Referenz zurückgeben Allgemeine Java-Themen 6
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
G Polymorphie Funktion als Parameter Allgemeine Java-Themen 8
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
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
N Funktion als Parameter einer anderen Funktion Allgemeine Java-Themen 5
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
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

Ähnliche Java Themen

Neue Themen


Oben