Klassen in einer Hashmap regestrieren

Hallo,
ich möchte gerne in einer Hashmap einpaar Klassen mit verschiedenen Namen regestrieren und von diesen dann je nach Aufruf eine Instanz erzeugen. Ich habe im folgenden ein kleines Beispiel und würde mich, über Tipps ob es so funktionieren könnte, freuen.

PS: Müssen die Klassen die ich regestriren möchte statisch sein? Was ist eigentlich der Unterschied zwieschen von einer Klasse ein Objekt erzeugen oder eine Klasse mit der Endung .class aufrufen also Klassenname.class?

    public class CallHandler
    {
     
      protected static final String WARENKORB = "Warenkorb",
          BESTELLUNG= "Bestellung", SUCHE = "Suche";
     
      public static Hashtable<String, Class> handlerHashmap  = new Hashtable<String, Class>();
     
      //Die Klassen regestrieren
      static {
        handlerHashmap.put(WARENKORB,Warenkorb.class);
        handlerHashmap.put(BESTELLUNG,Bestellung.class);
        handlerHashmap.put(SUCHE ,Suche.class);
      }
     
      static void registerHandler(String name, Class klasse)
      {
     
       
        if (WARENKORB.equalsIgnoreCase(name))
         //Instanz der Klasse erzeugen
        else
          if (SUCHE.equalsIgnoreCase(name))
            //Instanz der Klasse erzeugen
          else
            if (BESTELLUNG.equalsIgnoreCase(name))
               //Instanz der Klasse erzeugen
            else
            {
              //Fehlermeldung
            }
      }
    }

Gruß

Klingt schräg. Beschreib’ nochmal, was du damit eigentlich erreichen willst - also wie das am Ende angewendet werden soll…

Klassenname.class liefert dir eine Instanz der Klasse Class, genauer gesagt bekommst du ein Class<Klassenname>. Diese Instanz ist natürlich etwas komplett anderes als eine Instanz deiner Klasse Klassenname.

Natürlich nicht.

Zu deinem Code:
Die Methode registerHandler brauchst du doch nicht oder? Dir fehlt doch eher eine Methode getInstance(String name), die könnte so aussehen:

  Class<?> clazz =  handlerHashmap.get(name);
  
  Object instance = clazz.newInstance();
  return instance;
}

Da sollte man natürlich noch ein paar Fehlerüberprüfungen mit reinnehmen, zudem müssen deine registrierten Klassen einen Konstruktor ohne Parameter anbieten.

EDIT:
Ja, Erklärungen was du da machen willst wären echt prima :wink:

Ausprobieren? Grundsätzlich funktioniert das. Ob es so funktioniert wie gewünscht? Dazu müsste man wissen was Du vorhast.
Evtl. könnten dafür auch Enums interessant sein.
Warum die If Abfragen in der Methode? Um sich das zu sparen ist doch die Map da!?

Die Klassen müssen nicht statisch sein. Den Rest habe ich nicht verstanden. Was verstehst Du unter “eine Klasse” aufrufen? Der Unterschied zwischen Klasse und Objekt ist klar?

Wie wär’s mit einer Map, die von der Klasse (oder von mir aus auch einen String, wenn Du das lieber magst) auf einen Algorithmus zur Erzeugung von Instanzen dieser Klasse mappt? Ist viel flexibler, als sich darauf zu verlassen, dass Class.newInstance() funktioniert.

So viele Antworten und Vorschläge… noch bevor bekannt ist, ob die Ursache für die Frage vielleicht nur ist, dass der TO nicht weiß, wozu das Schlüsselwort ‚new‘ gut ist :smiley:

Erstmal danke für die Antworten,
Ja der Unterschied zwieschen Klasse und Objekt ist schon klar nur der Unterschied zwieschen Instanz einer Klasse mit .class und einem Objekt(Synonym Instanz?) einer Klasse ist noch nicht so ganz klar.

Am ende soll es ein Servlet werden der eine statische Hashmap mit CallHandlern (name, Handler) hat also statische Methode static void registerHandler(name, Class). Wenn ein Call reinkommt wird mit Hilfe des namens nach regestrierten Kandidaten gesucht wenn ja wird eine Instanz erzeugt. :eek:

[QUOTE=JavaFan]Erstmal danke für die Antworten,
Ja der Unterschied zwieschen Klasse und Objekt ist schon klar nur der Unterschied zwieschen Instanz einer Klasse mit .class und einem Objekt(Synonym Instanz?) einer Klasse ist noch nicht so ganz klar.

Am ende soll es ein Servlet werden der eine statische Hashmap mit CallHandlern (name, Handler) hat also statische Methode static void registerHandler(name, Class). Wenn ein Call reinkommt wird mit Hilfe des namens nach regestrierten Kandidaten gesucht wenn ja wird eine Instanz erzeugt. :eek:[/QUOTE]
Achso, ein Dispatcher, aehnlich wie struts das mal gemacht hat.

Wozu static in Servlets?

Nehme an das das nur fuer akademische Zwecke ist?