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.