jghj Geschrieben 23. März 2006 Geschrieben 23. März 2006 Hallo wissende, ich weiß in java gibt es nicht wirklich pointer. Aber intern muss es ja mit pointern arbeiten. Ich möchte jetzt per pointer eine funktion aufrufen, (also bzw. einfach einer funktion eine funktionsreferenz mitgeben, die aufgerufen werden kann) Leider kann ich hier auch keine prototypen erstellen auf die ich casten könnte .. jemand ne idee? danke im voraus mfg jghj Zitieren
Pinhead Geschrieben 23. März 2006 Geschrieben 23. März 2006 Übergebe deiner Funktion eine Klasse die die auszuführende Funktion beinhaltet Zitieren
jghj Geschrieben 23. März 2006 Autor Geschrieben 23. März 2006 und da gibts keine andere Möglichkeiten? ich mein ich kann ja nit für jede Funktion ne eigene Klasse stricken, da hab ich dann 50 klassen mit fast keinem inhalt.. oder dass man einfach was evaluaten kann? Zitieren
Krain Geschrieben 23. März 2006 Geschrieben 23. März 2006 Andere Frage - Wofür braucht man das? Ich kann mir derzeit kein Anwendungsbeispiel dazu vorstellen. Zitieren
Pinhead Geschrieben 23. März 2006 Geschrieben 23. März 2006 Mir ist nicht genau klar was eigentlich geschehen soll. Daher kann ich auch nicht sagen ob es eine andere Möglichkeit gibt. Was für Funktionen sollen den übergeben werden. Wer entscheidet welche Funktion aufgerufen wird. Warum müssen die Funktionen einer anderen Funktion übergeben werden und werden nicht direkt gestartet ? Zitieren
jghj Geschrieben 23. März 2006 Autor Geschrieben 23. März 2006 alsoooo.... ;-) ich schreibe mir gerade eine kleine applikation, die ein dynamisches Navigationsmenü haben soll. Dafür hab ich eine kleine klasse geschrieben und füge die "links" folgendermaßen ein: nav.add( "Value", [funktionsreferenz] ); so. Jetzt wird die navigation dargestellt mit dem Text "Value", und beim klick darauf soll eben die Funktion der [funktionsreferenz] aufgerufen werden. Zitieren
Pinhead Geschrieben 23. März 2006 Geschrieben 23. März 2006 Ok...wird klarer In dem Fall würde ich das Interface des ActionListeners empfehlen. In deinem Navigationmenü weist du dann jedem Eintrag ein ActionCommand zu. Und die actionPerformed Methode prüft dann das empfangene ActionCommand und führt die entsprechende Funktion aus Zitieren
jghj Geschrieben 23. März 2006 Autor Geschrieben 23. März 2006 an diese möglichkeit hab ich auch schon gedacht. Aber die fand ich eben nicht sehr schön wegen dem overhead durch die extra namensvergabe für aktionen, und dann muss man da wieder durchswitchen und des richte raussuchen ;-) Zitieren
Aiun Geschrieben 23. März 2006 Geschrieben 23. März 2006 du kannst auch, wie oben beschrieben, für jede Funktion eine Klasse schreiben und die mitgeben. Dann musst du eben nicht durchswitchen. Ein "Funktionsaufruf" durch Pointer ist schlicht keine Objektorientierung. Da kommst du schnell in teufels Küche mit. Also ich würde dir eher empfehlen, jede mögliche Aktion in eine Klasse zu packen. Zitieren
Bubble Geschrieben 23. März 2006 Geschrieben 23. März 2006 kommst du schnell in teufels Küche mit. Also ich würde dir eher empfehlen, jede mögliche Aktion in eine Klasse zu packen. In C# gäbe für diesen Zweck delegates. In Java könnte man einen Weg über ein Interface oder eine Klasse gehen, ober eben mittels ActionListener. Alternativ im Web nach Implementierungen für C#-delegate-ähnliches Verhalten in Java suchen. Zitieren
ksg9-sebastian Geschrieben 27. März 2006 Geschrieben 27. März 2006 Über Reflection ist das teilweise machbar... du könntest eine Klasse erstellen welche nur für die Navigation zuständig ist, diese enthält sämtliche Methoden, z.b. void showIndex, void showForum u.s.w. Dann erstellst du dir ne ReflectionHelper-Klasse welche ein Objekt der Navigation-Klasse und die Methode die aufgerufen werden soll übergeben bekommt (Die Methode per Name als String). Und dann eben mit der ReflectionAPI die Methode ausführen, evtl. noch Parameter mitgeben. Gruß Zitieren
perdian Geschrieben 27. März 2006 Geschrieben 27. März 2006 ich weiß in java gibt es nicht wirklich pointer. Aber intern muss es ja mit pointern arbeiten.Nein, Pointer sind in richtiger objektorientierter Programmierung unnötig. Letzten Endes ist alles ein Objekt, und daher kann man auch eigentlich alle Abläufe damit behandeln. Das von dir angesprochene Konzept eines Funktionszeigers wird in der objektorientierten Programmierung durch das Delegate Pattern abgebildet. Hierzu wird ein Interface oder eine Klasse als Basisklasse verwendet, die in irgendeiner Art und Weise eine Schnittstelle (= eine Methode) definiert, die von der ausführenden Instanz aufgerufen wird. Durch Vererbung kann dann der Delegate Instanz selber jeder beliebige Ausführungsfluss gegeben werden. ich mein ich kann ja nit für jede Funktion ne eigene Klasse stricken, da hab ich dann 50 klassen mit fast keinem inhalt..Das ist durchaus normal. Gerade bei GUI Projekten hast du in der Regel eine ganze Reihe von Klassen, die für sich genommen so gut wie keinen Inhalt haben, allerdings trotzdem vorhanden sind. Ein Beispiel für so etwas wäre bieten sich immer Zugriffe auf den EventDispatcher Thread, also so etwas in der Art: package xx; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class EventDispatcherExample { public static void main(String[] args) { final JLabel label = new JLabel("START"); final JPanel contentPane = new JPanel(new BorderLayout()); contentPane.add(label, BorderLayout.CENTER); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setSize(200, 150); frame.setContentPane(contentPane); frame.setLocationRelativeTo(null); frame.setVisible(true); // Thread starten und Zeit ausgeben new Thread() { [color=blue] public void run() { while(true) { try { // GUI updaten SwingUtilities.invokeLater(new Runnable() { [color=green] public void run() { label.setText(new java.util.Date().toString()); }[/color] }); // Warten Thread.sleep(1000); } catch(InterruptedException e) { // Ignore } } }[/color] }.start(); } } Alles definiert in einer Klassendatei. Durch die Verwendung von anonymen inneren Klassen (der Thread + die Runnable Impementierung zum Zugriff auf den EDT) erzeugen folgende Klassen (die Farben zeigen dabei an, welcher Codebereich durch welche Klasse hinterher im Bytecode repräsentiert wird). EventDispatcherExample.class EventDispatcherExample$1.class EventDispatcherExample$1$1.class Über Reflection ist das teilweise machbar...Machbar ja - aber kilometerweit am eigentlichen Ziel vorbei. Bei jeder Verwendung von Reflection sollte man sich vorher immer überlegen: Geht das nicht auch anders? Durch Reflection-Aufrufe verliert das Programm nämlich nicht nur an Performance (das ist in der Regel zu verschmerzen) sondern an allererster Stelle massiv an Übersichtlichkeit. Reflection ist ein Feinmechanikerwerkzeug und sollte daher auch nur fein dosiert eingesetzt werden und nicht bei jedem Problem direkt als "damit kann man das auch machen" Lösung präsentiert werden. Zitieren
ksg9-sebastian Geschrieben 30. März 2006 Geschrieben 30. März 2006 Machbar ja - aber kilometerweit am eigentlichen Ziel vorbei. Bei jeder Verwendung von Reflection sollte man sich vorher immer überlegen: Geht das nicht auch anders? Durch Reflection-Aufrufe verliert das Programm nämlich nicht nur an Performance (das ist in der Regel zu verschmerzen) sondern an allererster Stelle massiv an Übersichtlichkeit. Reflection ist ein Feinmechanikerwerkzeug und sollte daher auch nur fein dosiert eingesetzt werden und nicht bei jedem Problem direkt als "damit kann man das auch machen" Lösung präsentiert werden Ääähm..ja, natürlich ist Reflection die letzte Lösung die ich benutzen würde, aber so wie er es beschrieben hat die einzige Möglichkeit. Interfaces will er nicht(ich nehm mal an dass er mit nem Prototyp ein Interface meinte) und deshalb bleibt nichtmehr viel übrig. Folgende Lösung würde ich vorschlagen: Ein Interface (Action) welches nur ne actionPerformed(x, y, z)-Methode hat. Für jeden Navigationspunkt eine eigene Klasse welches das Action-Interface implementiert. Eine Mapping-Datei, in der nur drinsteht welcher String auf welche Klasse gemappt wird (notfalls auch direkt im Code per Map realisierbar). Map mapping = new HashMap(); mapping.put("index", de.navi.IndexAction); mapping.put("forum", de.navi.ForumAction); . . Und dann eben eine Klasse um die Mappings aufzulösen (MappingResolver). Die Klasse erhält die angeforderte Seite als String und holt sich aus der Mapping-Map/Mapping-Datei die entsprechende Klasse. Dann ein Objekt dieser gefundenen Klasse erzeugen, das ganze auf auf "Action" casten (das Interface) und eben die performAction vom Interface ausführen. private Map<String, Class> mapping = new HashMap<String, Class>(); . . public void gotoPage(String target){ Class clazz = null; if((clazz = mapping.get(target)) != null){ Action iAction = (Action)clazz.newInstance(); action.performAction(); } } Ist zwar am anfang bissl komisch, grade weils viele "leere" Klassen gibt, aber ist die einzige wirklich saubere Lösung. Auserdem ist es von der Wartung her klasse. Neue Sachen hinzufügen u.s.w. hast du kaum Aufwand, lediglich - Neue Klasse erzeugen (implements Action) - String in Mapping-Map/Mapping-Tabelle eintragen - Navigationspunkt hinzufügen Das ist wunderbar so...mach ich auch fast immer so. Gruß seb Zitieren
perdian Geschrieben 30. März 2006 Geschrieben 30. März 2006 die ich benutzen würde, aber so wie er es beschrieben hat die einzige Möglichkeit.Das sehe ich anders. Es geht hier um Planung und Strukturierung zur Entwicklungszeit. Reflection macht allerdings nur dann wirklich Sinn, wenn sich erst zur Laufzeit bestimmte Parameter ändern bzw. erst ergeben, die einen Einfluss auf die Klassengestaltung an sich haben. Wie gesagt: Es gibt viel weniger Fälle, wo man tatsälich Reflection einsetzen muss, als es auf den ersten Blick den Anschein macht. Interfaces will er nichtWoraus folgerst du das denn? Und selbst wenn jemand etwas auf den ersten Blick nicht will heisst doch noch lange nicht, dass man nicht durch eine überzeugende Argumentation rüberbringen kann: "Doch, genau das ist der richtige Weg". Wenn mir ein neuer Kollege ankommt und aufgrund von mangelnden Designkenntnissen und mangelnder Kenntnis von objektorientierter Programmierung alles direkt mit Reflection erschlagen will, der kann direkt vergessen irgendwelche verantwortungsvollen Aufgaben an einem Projekt übertragen zu bekommen, bis er nicht die nötigen Grundlagen beherrscht. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.