Ich habe eine Klasse, die eine Nachricht lesen sollte, extrahieren Sie ihren Typ aus dem Umschlag und rufen Sie dann eine Methode, die die Nachricht verarbeiten müssen; Jedem Nachrichtentyp ist ein Aufzählungsmember zugeordnet.Overhead der Suche und Aufruf einer Methode mit Reflektion
Es gibt mehr als 30 Nachrichtentypen.
Ein Weg, um die Nachricht zu versenden ist, nur einen Schalter zu verwenden, aber es ist wirklich hässlich und fehleranfällig (habe ich diesen Fall schon? Trace diesen Fall zweimal?). Eine andere Möglichkeit besteht darin, eine Schnittstelle mit einem einzelnen Methodenprozess (Daten) zu definieren und für jeden Nachrichtentyp, der diese Schnittstelle implementiert, eine Klasse zu erstellen, diese Klassen mit einer Karte zu registrieren und im Code, der die Nachricht verarbeiten soll, zu agieren. Rufen Sie einfach map.get (messageType) .process (data) auf; aber es ist wirklich ärgerlich, 30+ Klassen zu erstellen.
Ein anderer Weg ist die Verwendung von reflection: Definieren Sie für jeden Nachrichtentyp eine Funktion mit einem genauen Signatur- und Musternamen wie processMessagetype; dann erstellen Sie eine Karte von Nachrichtentyp zu Methode (gefüllt mit einer einfachen Suche auf getDeckaredMethods()) und dann etwas tun wie: map.get (messageType) .invoke (this, data).
Welche Methode sollten Sie verwenden? Was ist der Overhead der Java-Reflektion?
Großartig, das war genau das, was ich gesucht habe. Vielen Dank! – akappa