Heiner KückerFinder-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 SubClassIn 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 ContainerAngenommen, 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/ImplementierungDer 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/ImplementierungenDies 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ötigtHierfür sehe ich zwei Möglichkeiten:
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 ChainOfResponsibilityIm 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 ChainOfResponsibilityZusätzliche ChainHandler müssen nicht im Code eingetragen werden.
VorteileWegfall redundanter Konfigurationseinstellungen. Fast automatische Einbindung von Funktionalitäten in Java-Frameworks.
NachteileGeringere 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. RealisierungBei 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. |