Zum Inhalt springen

Classemethode dynamisch erzeugen


Empfohlene Beiträge

Geschrieben

Hallo,

Ich habe folgendes Problem zwar theoretisch gelößt aber bräuchte Hilfe bei der Umsetzung:

Ich habe einige Klasse zur Suche von Objekten (Firmen, Geräte usw.). Diese werden jetzt über verschiedene Klassen (von denen keine Instanzen erzeugt werden) geladen.

Da ich aber nicht jede Klasse einzeln aufrufen möchte, hab ich mir gedacht ich mach das ganze dynamisch:

Eine Factory (welche auch die abstrakte Basis Klasse für die Unterklassen ist) soll diese Methoden selber aufrufen.

Die Klassen haben fast alle den selben Namen - GeraetSearchforxxx (wobei xxx das zusuchende Attribut ist).

Jetzt dacht ich mir, ich mach das über die Klasse Class.

also:


public static Collection find (String searchAttribut, searchText, searchOperator) {

 return ((GeraetSearchforID) Class.forName(CLASS_PACKAGE + STD_CLASS_NAME + searchAttribut)).find(searchText,searchOperator);

}

Dabei geben alle Methoden der Unterklasse eine Collection zurück. CLASS_PACKAGE ist das Package in dem die SuchKlassen liegen. STD_CLASS_NAME ist "GeraetSearchfor" und Attribut wäre hier "ID".

Soweit zur Theorie... praktisch funktioniert das allerdings nicht wirklich:

Cannot cast from Class to GeraetSearchforID.

The static method find(...) from GeraetSearchforID be accessed in a static way.

Wäre äußerst dankbar für Hilfe.

In der Java API zu 1.4 hab ich jedenfalls nicht wirklich was brauchbares gefunden.

Geschrieben

Könnte daran liegen, daß Dein Aufruf versucht ein Objekt der Klasse zu initialisieren:

public static Class forName(String className)

throws ClassNotFoundException

Returns the Class object associated with the class or interface with the given string name. Invoking this method is equivalent to:

Class.forName(className, true, currentLoader)

Geschrieben
ich will nur die Methoden der Klasse benutzen können und sie nicht instanziieren
Du solltest dich dringend genauer mit den Grundlagen von objektorientierter Programmierung auseinandersetzen, wenn du dir nicht dein gesamtes Design auf Jahre hinaus versauen willst. Eine Methode kann nicht losgelöst von der Klasse existieren, von der sie definiert worden ist und dynamisches Laden von Klassen ist eher eine Ausnahmesituation, als eine angenehme Lösung für das erreichen der meisten Ziele.
Geschrieben
Du solltest dich dringend genauer mit den Grundlagen von objektorientierter Programmierung auseinandersetzen, wenn du dir nicht dein gesamtes Design auf Jahre hinaus versauen willst. Eine Methode kann nicht losgelöst von der Klasse existieren, von der sie definiert worden ist und dynamisches Laden von Klassen ist eher eine Ausnahmesituation, als eine angenehme Lösung für das erreichen der meisten Ziele.

*zustimm*

Erklär' doch einmal leicht verständlich was Du vorhast. Dann können wir evtl. auch mit einem objektorientierten Ansatz weiterhelfen.

Geschrieben

Das Problem an dem ganzen ist ganz einfach das ich für jede Suche eine extra Klasse anlegen soll...

bei mitlerweile 50 - 60 Klassen verlier ich aber allmählich die Übersichtlichkeit.

Sicher könnte ich das auch ganz einfach mit einem IF-ELSE Konstrukt realisieren - nur da geht wieder die Übersichtlichkeit drauf. Außerdem würde ich meinen dass der Prozess schneller abgehandelt ist, wenn genau diese eine Klasse (mit Funktion) erzeugt wird bevor er erst unzählige von Abfragestrukturen durchgeht.

Geschrieben

Hi,

wie suchst Du denn? Durchsuchst Du eine SQL-Datenbank?

Vielleicht brauchst Du auch nicht unbedingt für jede Datenbank/Tabelle (?) eine eigene Klasse.

Mir scheint es auch, dass die ganze Sache nicht so kompliziert sein muss.

Gruß

Geschrieben

ja, db

Also momentan ist es noch mysql zwecks Entwicklung...

später ist es dann oracle

dass mit der klasse für jede suche war eine vorgabe. Ich hätte das auch am liebsten in eine reingehauen... - allerdings wäre dann wieder das Problem, dass man soviele verschiedene methoden hat - ich hab das am liebsten alles zentralisiert, also dass man nur eine methode mit den entsprechenden parametern aufrufen muss...

btw: sind durchschnittlich 6 Objektklassen mit ~ 12 attributen... (wobei nicht immer alle im Tabellenmodell abgebildet werden)

Geschrieben

Hi,

sry aber ich kann mir leider noch immer kein Bild von dem Problem machen...

Vielleicht kannst Du eine Klasse bauen und ihr die Suchparameter übergeben. Anhand der Suchparameter kann diese Klasse vielleicht versuchen die Suche zu deligieren. Da kann man bestimmt auch was mit abstrakten Methoden machen oder etwas in der Art.

Gruß

Geschrieben

Ich erklärs nochmal,

wieder anhand von code:


class SearchFactory

{

[INDENT]find(String Typ, String Attribut, String text) {

[INDENT]//hier soll eine Schnittstellenfunktion geladen werden[/INDENT]


}[/INDENT]

}


class TypASearchFactory extends SearchFactory{

[INDENT]find(String Attribut, String text) {

[INDENT]//hier soll eine Schnittstellenfunktion geladen werden[/INDENT]


}[/INDENT]

}


class TypBSearchFactory extends SearchFactory{

[INDENT]find(String Attribut, String text) {

[INDENT]//hier soll eine Schnittstellenfunktion geladen werden[/INDENT]


}[/INDENT]

}


class TypASearchFactoryAttributA extends TypASearchFactory {

[INDENT]find(String text) {

[INDENT]//hier werden Objekte geladen[/INDENT]


}[/INDENT]

}


class TypASearchFactoryAttributB extends TypASearchFactory {

[INDENT]find(String text) {

[INDENT]//hier werden Objekte geladen[/INDENT]


}[/INDENT]

}


class TypBSearchFactoryAttributA extends TypBSearchFactory {

[INDENT]find(String text) {

[INDENT]//hier werden Objekte geladen[/INDENT]


}[/INDENT]

}


class TypBSearchFactoryAttributB extends TypBSearchFactory {

[INDENT]find(String text) {

[INDENT]//hier werden Objekte geladen[/INDENT]


}[/INDENT]

}


So in etwa hatte ich mir das gedacht... Sprich ich ruf eine Funktion der Superklasse auf, die ruft die Basisklasse des entsprechenden Typs auf und diese hat eine Funktion, die die einzelne Suchklassenfunktion aufrufen soll...

Also Fabrik -> TypFabrik -> AttributSuche

Wenns wirklich so schlechtes Design ist wie perdi sagte, werd ich wohl doch ein großes if-else verwenden...

dachte halt so ist das übersichtlicher... :(

Geschrieben
Das Problem an dem ganzen ist ganz einfach das ich für jede Suche eine extra Klasse anlegen soll... bei mitlerweile 50 - 60 Klassen verlier ich aber allmählich die Übersichtlichkeit.

50 bis 60 Klassen? Für jede Suche eine einzige Klasse? :eek

Das riecht nach ganz grauenhaften Design. Vererbung ist ja eine feine Sache, aber gerade hier vollkommen unangebracht. Für eine Suche gibt es andere Patterns die hier Verwendung finden sollten. Als Beispiel fällt mir hier ein, ein einziges Suchobjekt zu haben, dass dann entsprechend der Eingaben unterschiedlich mit Werten befüllt wird und von der ausführenden Suchklasse dann anhand dieser Objekte wieder ausgelesen wird.

Außerdem würde ich meinen dass der Prozess schneller abgehandelt ist, wenn genau diese eine Klasse (mit Funktion) erzeugt wird bevor er erst unzählige von Abfragestrukturen durchgeht.
Vorsicht: Fange nicht an zu optimieren, bevor du durch intensive Untersuchungen (z.B. durch einen Profiler) herausgefunden hast, dass du tatsächlich ein Performanceproblem hast. Auf der einen Seite kann der JIT Compiler durchaus IF-Strukturen zur Laufzeit optimieren, auf der anderen Seite gibt es meistens bei jedem Programm Stellen, die deutlich mehr die Performance bremsen.
Geschrieben
50 bis 60 Klassen? Für jede Suche eine einzige Klasse? :eek

Das riecht nach ganz grauenhaften Design. Vererbung ist ja eine feine Sache, aber gerade hier vollkommen unangebracht. Für eine Suche gibt es andere Patterns die hier Verwendung finden sollten. Als Beispiel fällt mir hier ein, ein einziges Suchobjekt zu haben, dass dann entsprechend der Eingaben unterschiedlich mit Werten befüllt wird und von der ausführenden Suchklasse dann anhand dieser Objekte wieder ausgelesen wird.

Gut 50-60 war bissl übertrieben... sind vielleicht 15 :floet:

dennoch viel... das mit der einzelnen klasse hab ich mir auch gedacht aber ich halt mich halt an die vorgaben :rolleyes:

Wieso soll ich die Suche eigentlich instanziieren ? würde doch mehr Sinn machen wenn es ein Interface ist welches einzelne Funktionen zur Verfügungstellt.

Geschrieben
Wieso soll ich die Suche eigentlich instanziieren ? würde doch mehr Sinn machen wenn es ein Interface ist welches einzelne Funktionen zur Verfügungstellt.
Dir hierauf hier im Forum eine Antwort zu geben würde nur an der Oberfläche kratzen. Was du machen solltest ist dir ein gutes Buch/Tutorial/whatever zuzulegen, wo erstmal die grundlegenden Prinzipien von objektorientierter Programmierung behandelt werden. Als nächstes wäre dann ein witerführendes Werk über Design Patterns angesagt. Alels Dinge, die einem nicht sofort weiterhelfen, die aber (in der Regel) einen bleibenden Eindruck hinterlassen und sich auf den weitere Programmierstil auswirken und damit für strukturelle Probleme von vorneherein Lösungen vorschlagen bevor das ganze Design vermurkst ist.

Und ja, das wird sowohl zeitlich als auch inhaltlich anspruchsvoll und ist nicht mal eben in in paar Tagen erledigt - aber gut Software-Entwicklung ist eben keine Sache, die man mal eben nebenbei erledigen kann.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...