Guten Abend allerseits
Folgendes Problem: Ich bräuchte etwas in der Art wie das hier:
Ja, ich weiß daß das nicht geht...das ist das Problem. Ich hab auf StackOverflow eine interessante Lösung gefunden, nämlich eine Map zu erstellen mit einem Class-Objekt als Key und der Methode als Value. Die Frage ist: wie krieg ich eine private Methode als Value in die Map gepackt? Kann mir mal jemand den Code hier bitte erklären?
stackoverflow.com
In C würde man jetzt einfach einen Funktionspointer verwenden, aber in Java...?
Um mal das Problem etwas zu beschreiben: Ich habe ein (abstrakte) TreeItemklasse. Um einen Baum aufzubauen. Jetzt möchte ich Nachrichten durch den Baum schicken. Ich kann zwar über Address-Objekte mir jedes TreeItem geben lassen, aber manche Operationen werden mir damit zu mühselig. Z.B. möchte ich mir die Addressobjekte aller Kindobjekte eines bestimmten TreeItems geben lassen. Nachrichten können gebroadcastet oder an bestimmte TreeItems gesendet werden.
Ich hätte am liebsten eine abstrakte Enumklasse deklariert von der ich eine spezielisierte Enumklasse für mein Projekt abgeleitet hätte. Dummerweise ist Enum aber final, da kann ich nix ableiten. (Bisher hab ich die TreeItems sehr generisch gelassen, sodaß ich sie auch für etwas anderes verwenden kann. Und mit einer festgenagelten Enumeration versaue ich mir das.)
Also hab ich eine abstrakte Klasse TreeitemMessage gebaut. Diese Klasse kann jetzt beliebig abgeleitet und auch als Antwort verwendet werden. Je nachdem, was ich von den TreeItemobjekten will.
Ich will also z.B. ein sendAddressOfAllYourChildren()-Objekt an ein bestimmtes TreeItemobjekt senden. Zurück kommt ein HashSet<AddressrequestReply> (AddressrequestReply extends TreeitemMessage).
Das ganze ist so aufgebaut:
Ich könnte das Problem notfals ja mit einem Riesenhaufen
Folgendes Problem: Ich bräuchte etwas in der Art wie das hier:
Java:
private void theProblemDemo(Object anyObject){
switch(anyObject instanceof){
case ClassA:
methodForClassA();
break;
case ClassB:
methodForClassB();
break;
//Und so weiter...
}
}
Ja, ich weiß daß das nicht geht...das ist das Problem. Ich hab auf StackOverflow eine interessante Lösung gefunden, nämlich eine Map zu erstellen mit einem Class-Objekt als Key und der Methode als Value. Die Frage ist: wie krieg ich eine private Methode als Value in die Map gepackt? Kann mir mal jemand den Code hier bitte erklären?
Java:
Map<Class,Runnable> doByClass = new HashMap<>();
doByClass.put(Foo.class, () -> doAClosure(this));
doByClass.put(Bar.class, this::doBMethod);
doByClass.put(Baz.class, new MyCRunnable());

Is it possible to use the instanceof operator in a switch statement?
I have a question of using switch case for instanceof object: For example: my problem can be reproduced in Java: if(this instanceof A) doA(); else if(this instanceof B) doB(); else if(this
In C würde man jetzt einfach einen Funktionspointer verwenden, aber in Java...?
Um mal das Problem etwas zu beschreiben: Ich habe ein (abstrakte) TreeItemklasse. Um einen Baum aufzubauen. Jetzt möchte ich Nachrichten durch den Baum schicken. Ich kann zwar über Address-Objekte mir jedes TreeItem geben lassen, aber manche Operationen werden mir damit zu mühselig. Z.B. möchte ich mir die Addressobjekte aller Kindobjekte eines bestimmten TreeItems geben lassen. Nachrichten können gebroadcastet oder an bestimmte TreeItems gesendet werden.
Ich hätte am liebsten eine abstrakte Enumklasse deklariert von der ich eine spezielisierte Enumklasse für mein Projekt abgeleitet hätte. Dummerweise ist Enum aber final, da kann ich nix ableiten. (Bisher hab ich die TreeItems sehr generisch gelassen, sodaß ich sie auch für etwas anderes verwenden kann. Und mit einer festgenagelten Enumeration versaue ich mir das.)
Also hab ich eine abstrakte Klasse TreeitemMessage gebaut. Diese Klasse kann jetzt beliebig abgeleitet und auch als Antwort verwendet werden. Je nachdem, was ich von den TreeItemobjekten will.
Ich will also z.B. ein sendAddressOfAllYourChildren()-Objekt an ein bestimmtes TreeItemobjekt senden. Zurück kommt ein HashSet<AddressrequestReply> (AddressrequestReply extends TreeitemMessage).
Das ganze ist so aufgebaut:
Java:
public abstract class TreeItem {
private HashMap<UUID, TreeItem> children;
private final UUID ME;
private TreeItem parent;
//...
public HashSet<TreeitemMessage> brodcastMessageToTreeItems(TreeitemMessage msg){
HashSet<TreeitemMessage> hashSet = new HashSet<>();
hashSet.add(processMessage(msg));
for (Map.Entry<UUID, TreeItem> entry : children.entrySet()) {
hashSet.addAll(entry.getValue().brodcastMessageToTreeItems(msg));
}
return hashSet;
}
public HashSet<TreeitemMessage> sendMessageToTreeitems(TreeitemMessage msg, Address... addresses){
HashSet<TreeitemMessage> hashSet = new HashSet<>();
for(Address a : addresses){
if(itMeansMe(a)){
hashSet.add(processMessage(msg));
}
else{
for (Map.Entry<UUID, TreeItem> entry : children.entrySet()) {
if(entry.getKey().equals(a.getNext(ME))){
hashSet.addAll(entry.getValue().sendMessageToTreeitems(msg, a));
}
}
}
}
return hashSet;
}
/**
* Hier werden von der konkreten Klasse später Nachrichten verarbeitet.
* Und hier will ich durch verschiedene TreeitemMessageobjekte andere
* Aktionen auslösen.
*/
protected abstract TreeitemMessage processMessage(TreeitemMessage msg);
}
Ich könnte das Problem notfals ja mit einem Riesenhaufen
if( msg instanceof ...)
erschlagen, aber ist doch Mist, das muß einfach besser gehen.