_pa
Cadet 3rd Year
- Registriert
- Dez. 2007
- Beiträge
- 44
Hallo Zusammen,
ich soll hier ein Tool programmieren, dass mehrere Dateien importiert und in eine Datenbank schreibt.
Die Dateien sind grundsätzlich so aufgebaut
Ich hab mir also eine AbstractDatensatz gebaut von der DatensatzA, DatensatzB... erben
Im Prinzip sind es reine Entities, sprich die Klassen bestehen nur aus Membern und zugehörigen gettern/settern.
Das importieren funktioniert auch alles wunderbar, beim einlesen der der Daten erstell ich die Datensatz Objekte und schmeiss sie in eine ArrayList<AbstractDatensatz>.
Das Konzept, welches ich mir zur Speicherung ausgedacht habe funktioniert nur leider nicht wie ich gedacht habe.
Idee war: Ich erstell ein Interface für meine Speicherkomponente (Persistor)
Der Persistor weiß jetzt wie er mit den entsprechenden Datensatz Objekten umzugehen hat (DatensatzA in SQLite, DatensatzB in MySQL, DatensatzC in Textdatei usw).
Meine Idee war das durch überladen der persist Methode zu machen:
Iteriere ich jetzt aber über die ArrayList<AbstractDatensatz> wird immer nur die public void persist(AbstractDatensatz satz) aufgerufen - was im Nachhinein betrachtet natürlich auch vollkommen richtig ist, mir jetzt aber nicht hilft
Wie löse ich jetzt am elegantesten das Problem die Datensätze zu speichern?
Was ich auf keinen Fall will: Die DatensatzA, DatensatzB sollen nicht wissen wie sie gespeichert werden.
Ideen die ich hatte:
1) Ich caste (über Reflection oder wie auch immer) entweder beim iterieren über ArrayList<AbstractDatensatz> die Objekte zu DatensatzA, DatensatzB...oder ich mach das in der public void persist(AbstractDatensatz satz) in der konkretem Implementierung von Persistor.
Dann klappts auch wieder mit der Überladung, aber was mach ich wenn ein unbekanntes Objekt kommt? Dann knallts zur Laufzeit...
2) Ich speicher mir die DatensatzA, DatensatzB... Objekte direkt in ArrayListen mit dem richtigen Typ. Dann funktioniert das mit der Überladung wieder.
Nachteil: Ich hab N-ArrayListen und N-Foreach schleifen
Sehr unschöne Lösung; muss viel angepasst werden wenn es neue Datensatz Typen gibt.
3) Ich verpasse der AbstractDatensatz eine public abstract void persist(IPersistor p); Methode und programmier die in den konkreten Implementationen so aus:
So hab ich zwar die Speicherung im Datensatz, aber trotzdem lose gekoppelt, weil die Implementierung im Persistor ist. Ist aber irgendwie Brainfuck das sich das Objekt selber an ein Objekt übergibt was ein Teil von ihm ist 
Vielleicht fällt euch ja nen guter Weg ein.
Danke schonmal im vorraus
ich soll hier ein Tool programmieren, dass mehrere Dateien importiert und in eine Datenbank schreibt.
Die Dateien sind grundsätzlich so aufgebaut
Code:
Datei1-Anfang
DatensatzA
DatensatzB
DatensatzB
.......
DatensatzC
Datei2-Ende
Ich hab mir also eine AbstractDatensatz gebaut von der DatensatzA, DatensatzB... erben
Im Prinzip sind es reine Entities, sprich die Klassen bestehen nur aus Membern und zugehörigen gettern/settern.
Das importieren funktioniert auch alles wunderbar, beim einlesen der der Daten erstell ich die Datensatz Objekte und schmeiss sie in eine ArrayList<AbstractDatensatz>.
Das Konzept, welches ich mir zur Speicherung ausgedacht habe funktioniert nur leider nicht wie ich gedacht habe.
Idee war: Ich erstell ein Interface für meine Speicherkomponente (Persistor)
Code:
public interface IPersistor
{
void persist(AbstractSatz satz) throws Exception;
}
Der Persistor weiß jetzt wie er mit den entsprechenden Datensatz Objekten umzugehen hat (DatensatzA in SQLite, DatensatzB in MySQL, DatensatzC in Textdatei usw).
Meine Idee war das durch überladen der persist Methode zu machen:
Code:
public class Persistor implements IPersistor
{
public void persist(AbstractDatensatz satz) throws Exception
{ //... }
public void persist(DatensatzA satz) throws Exception
{ //... }
public void persist(DatensatzB satz) throws Exception
{ //... }
....
}
Iteriere ich jetzt aber über die ArrayList<AbstractDatensatz> wird immer nur die public void persist(AbstractDatensatz satz) aufgerufen - was im Nachhinein betrachtet natürlich auch vollkommen richtig ist, mir jetzt aber nicht hilft
Wie löse ich jetzt am elegantesten das Problem die Datensätze zu speichern?
Was ich auf keinen Fall will: Die DatensatzA, DatensatzB sollen nicht wissen wie sie gespeichert werden.
Ideen die ich hatte:
1) Ich caste (über Reflection oder wie auch immer) entweder beim iterieren über ArrayList<AbstractDatensatz> die Objekte zu DatensatzA, DatensatzB...oder ich mach das in der public void persist(AbstractDatensatz satz) in der konkretem Implementierung von Persistor.
Dann klappts auch wieder mit der Überladung, aber was mach ich wenn ein unbekanntes Objekt kommt? Dann knallts zur Laufzeit...
2) Ich speicher mir die DatensatzA, DatensatzB... Objekte direkt in ArrayListen mit dem richtigen Typ. Dann funktioniert das mit der Überladung wieder.
Nachteil: Ich hab N-ArrayListen und N-Foreach schleifen
3) Ich verpasse der AbstractDatensatz eine public abstract void persist(IPersistor p); Methode und programmier die in den konkreten Implementationen so aus:
Code:
@Override
public void persist(IPersistor p)
{
try
{
p.persist(this);
}
catch (Exception e)
{
e.printStackTrace();
}
}
Vielleicht fällt euch ja nen guter Weg ein.
Danke schonmal im vorraus