Heiner Kücker

Finder-Feature

Home

Java-Seite

   Weiterentwicklung_Java

     NullPointer

     Algorithmische
     Symmetrie

     Finder_Feature

     Multiple_Interface
     Implementationen

     Proxy_Methoden

     Speicher_Klassen

   WebCam_Demo

   JSP WorkFlow
   PageFlow FlowControl
   Page Flow Engine
   Control_and_Command

   JSP_Spreadsheet

   Domain Parser

   Codegenerator_für
   hierarchische
   Datenstrukturen

   Expression_Engine
   Formula_Parser

   State Transition Engine

   AspectJ

   Java_Explorer

   DBF_Library

   Kalender_Applet

   SetGetGen

   BeanSetGet

   CheckPackage

   LineNumbers

   GradDms

   Excel-Export

   StringTokenizer

   JspDoc

   JspCheck

   JSP-Schulung
   Java Server Pages
   Struts

   AsciiTabellenLayouter

   StringSerial

   Silbentrennung

   JDBC_Schlüssel-
   Generierung

   bidirektional/
   unidirektional
   gelinkte Liste

   Java_Sitemap
   Generator

   XmlBuilder

   RangeMap

Alaska-XBase++-Seite

Projekte

Philosophien
Techniken


Konzepte

Sudoku

Kontakt /
Impressum


Links

SiteMap





Letzte Aktualisierung:
30.08.2002

Spracherweiterung Find ImplementationClass or SubClass

In vielen Java-Technologien, vor allem sogenannten Containern, müssen Klassen, die für bestimmte Funktionalitäten in das Framework eingebracht werden, in Konfigurationsdateien eingetragen werden.

Zusätzlich müssen diese Klassen bestimmte Regeln bei der Implementierung beachten. Das führt zu einer Zersplitterung der Funktionalität an viele Stellen der Applikation.

Eigentlich generell angelegte Pattern wie Polymorphie oder Chain of Responsibility benötigen ausser der Implementation der entsprechenden Interfaces oder abstrakten Klassen noch extra Code zum Zusammenfügen der Applikationselemente.

Beispiel Container

Angenommen, es gibt ein Applikationsframework. Dieses besteht aus Superklassen und Interfaces die von konkreten Klassen abgeleitet/implementiert werden müssen.

Die Superklassen/Interfaces kennen aber die Ableitungen/Implementierungen nicht. Also müssen die Ableitungen/Implementierungen dem Framework bekannt gemacht werden. Dafür gibt es die Lösungsmöglichkeiten: -Hinzufügen von Listenern/Observern zum Framework. -Schreiben der konkreten Ableitungen/Implementierungen in Konfig-Dateien und das Framwork lädt diese über den ClassLoader -Die Applikation muss eine Factory implementieren und dem Framework die konkreten Ableitungen/Implementierungen liefern Es gibt sicher noch ein paar mehr Möglichkeiten. Alle sind kompliziert und umständlich.

Meine Idee hat folgende Basis:

Wenn man eine javadoc-Dokumentation einer Applikation erstellt, werden die Subklassen/Implementierungen einer Klasse/Interface aufgelistet. Solche Tools können alle Sub-Klassen einer Klasse bzw. Implementationen eines Interfaces anhand der Ressourcen aus dem CLASSPATH finden.

Wenn nun das Java(oder was auch immer)-Laufzeit-System ein Feature bietet, im Scope der Applikation (CLASSPATH, JARs), eine/alle Ableitungen/Implementierungen zu finden, kann man sich folgende Lösungen vorstellen:

1. Es gibt genau eine Ableitung/Implementierung

Der Fall, daß es genau eine Ableitung/Implementierung gibt, könnte z.B. das Hauptfenster einer GUI-Applikation oder die zentrale Instanz einer Server- Applikation sein. Zuerst startet das Framework und holt sich die erwartete Ableitung/Implementierung, instanziiert diese und startet damit den Service.

Dadurch könnte zum Beispiel der main-Stummel einer Swing-Applikation verborgen werden.

2. Es gibt mehrere Ableitungen/Implementierungen

Dies könnten z.B. mehrere Servlets sein. Alle Ableitungen/Implementierungen werden vom Server instanziiert. Für den konkreten Zugriff über einen Namen oder Schlüssel stellen die Ableitungen/Implementierungen entsprechende Metadaten bereit oder erfüllen eine verlangte Namenskonvention.

3. Von mehreren Ableitungen/Implementierungen wird eine bestimmte benötigt

Hierfür sehe ich zwei Möglichkeiten:
  1. Es gibt eine Factory-Methode, die anhand eines Parameters die richtige Ableitung/Implementierung bestimmt. Das könnte zum Beispiel durch Absuchen aller Klassen-Namen oder Absuchen von Meta-Daten, welche von den konkreten Klassen bereitgestelltet werden, entsprechend dem Parameter erfolgen. Beim Suchen nach Namen müssen die Namen einer festgelegten Namenskonvention entsprechen.

  2. Das Laufzeit-System erledigt die Aufgabe obiger Factory-Methode.

Beipiel Polyphormie:

Hier der Code zum Aufbau einer Chain Of Responsibility klassisch, wobei die ChainHandler hart kodiert zur Chain hinzugefügt werden müssen:
public class ChainOfResponsibility{

  public void build(){
    ChainOfResponsibility chain=new ChainOfResponsibility();
    chain.add( ChainHandler1 ) ;
    chain.add( ChainHandler2 ) ;
    chain.add( ChainHandler3 ) ;
    chain.add( ChainHandler4 ) ;
    chain.add( ChainHandler5 ) ;
    chain.add( ChainHandler6 ) ;
    //jedes weitere ChainHandler muß hier hart kodiert eingehängt werden

  }//end method build

}//end class ChainOfResponsibility
Im Gegensatz dazu der Aufbau einer Chain Of Responsibility mit Finder-Feature:
public class ChainOfResponsibility{

  public void build(){
    ChainOfResponsibility chain=new ChainOfResponsibility();
    Enumeration e=Class.getSubClassesFor( ChainHandler.class ) ;
    while(e.hasMoreElements()){
      chain.add(e.nextElement());
    }//end while
  }//end method build

}//end class ChainOfResponsibility
Zusätzliche ChainHandler müssen nicht im Code eingetragen werden.

Vorteile

Wegfall redundanter Konfigurationseinstellungen. Fast automatische Einbindung von Funktionalitäten in Java-Frameworks.

Nachteile

Geringere Sicherheit durch Windows-ähnliche Default-Funktionalität. Hier müssen besondere Sicherheitsmechanismen eingebaut werden, welche die Vorteile wieder auffressen können.

Für das Nachladen von Klassen über ein Netz (UrlClassLoader) muß der Server spezielle Verzeichnisfunktionalitäten bieten.

Laufzeitprobleme, vor allem beim Starten des Service bzw. der Applikation.

Realisierung

Bei der Anfrage nach den Sub-Klassen oder beim Start der Applikation muß einmalig der CLASSPATH abgesucht werden. Alle Class-Files, auch die in den jar- Dateien, werden auf ihre Elternklasse und implementierte Interfaces untersucht. Daraus wird für alle Klassen, beginnend mit der Klasse Object, ein Vererbungsbaum aufgebaut. In diesen werden weitere Wurzeln für die Interfaces netzförmig eingewebt. Aus diesem Vererbungsnetz können die gewünschten Klassen ermittelt werden.