Methoden-Parameter und Return Statements mit variablen Daten

GambaJo

Grünschnabel
Hab da ein kleines Verständnisproblem:

Ich arbeite gerade an einer kleinen Datenbankanwendung mit einer GUI. Es handelt sich dabei um eine Objekt-Datenbank (db4o). Dafür wollte ich mir einen DAL schreiben, den ich auch in zukünftigen Projekten nutzen kann, d.h., er sollte möglichst abstrakt sein.
In diesem DAL habe ich entsprechende Methoden, mit denen ich die Datenbank öffne/erstelle und schließe. Es sollen noch Methoden folgen, mit denen ich Objekte in die Datenbank speichern kann, Methoden zum Löschen, Methoden zum Lesen eines Objekts aus der Datenbank usw.
Nun habe ich das Problem bei diesen Methoden, genauer gesagt bei den Parametern und den return statements.
Für jede "Tabelle" habe ich eine Klasse mit gettern und settern. Davon wird ein Objekt generiert, gefüllt und als Objekt in die Datenbank gespeichert. Das Objekt muss ich als Parameter an die Speicher-Methode übergeben. Der Objekttyp ist aber variabel, abhängig von der Klasse aus der es generiert wurde. Wie kann ich ein Parameter/Objekt mit variablen Objekttyp übergeben?
Gleiches Problem habe ich dann natürlich auch bei den return statements bei der Methode, die ein gelesenes Objekt zurückgeben soll.

Beispiel:

Zu Speichernde/lesende Klasse/Objekt:
Code:
public class Person {
    private String name;
    private byte alter;
    
    //Konstruktor
    public Person(String name, byte alter){
        this.name = name;
        this.alter = alter;
    }
    //Konstruktor
    public Person(){
        this.name = null;
        this.alter = 0;
    }
    
    //Getter
    public String getName(){
        return this.name;
    }
    public byte getAlter(){
        return this.alter;
    }
    
    //Setter
    public void setName(String name){
        this.name = name;
    }
    public void setAlter(byte alter){
        this.alter = alter;
    }
}

DAL-Klasse (Problem bei Insert/Update/getObject):
Code:
public class Db4o_dal {
    ObjectContainer object_container;
    String db_name = new String();
    
    //Kostruktoren
    public Db4o_dal(String db_name){
        this.db_name = db_name;
    }
    public Db4o_dal(){
    }

    //Connect or Create Databasefile
    public void ConnectToDB(String db_name){
        if(this.db_name.isEmpty()) this.db_name = db_name;
        if(this.db_name.isEmpty()) return;
        try{
            ObjectContainer oc=Db4o.openFile(this.db_name.toString());
            this.object_container = oc;
        } catch (Db4oIOException e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Fehler", JOptionPane.OK_CANCEL_OPTION);
        }
        
    }
    
    //Close Database
    public void CloseDB(){
        if(this.object_container != null){
            try{
                this.object_container.close();
            } catch(Exception e){
                JOptionPane.showMessageDialog(null, e.getMessage(), "Fehler", JOptionPane.OK_CANCEL_OPTION);
            }
        }
    }
    
    //Insert Object
    public void InsertObject(Object object){
        try{
            object_container.set((object.getClass().cast(object)));
        } catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Fehler", JOptionPane.OK_CANCEL_OPTION);
        }
    }

    //Update Object
    public void UpdateObject(Class<?> object){
        try{
            object_container.set(object);
        } catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Fehler", JOptionPane.OK_CANCEL_OPTION);
        }
    }
    
//Read object
    public Class<?> getObject(){
      return object;   
    }
}

Vor allem bei den Methoden zum Speichern kann ich das Objekt nicht als Objekttyp Object speichern oder casten, es muss schon als das Ursprungsobjekt vorliegen.

Ich hoffe, ich hab mich einigermaßen verständlich ausgedrückt, mir fehlt noch Vokabular.
 
Hallo,

meinst du sowas?
Java:
/**
 * 
 */
package de.tutorials;

import java.util.Iterator;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;

/**
 * @author Thomas.Darimont
 * 
 */
public class Db4oRepositoryExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        IRepository repository = new Db4oRepository();

        Person tom = new Person(1, "Tom");
        repository.store(tom);
        Person anne = new Person(2, "Anne");
        repository.store(anne);

        Person person = repository.get(new Person(1, null));
        System.out.println(person);
        System.out.println(repository.get(new Person(2, null)));

        System.out.println("#####");
        
        Cat kira = new Cat("Kira");
        Cat tiger = new Cat("tiger");

        repository.store(kira);
        repository.store(tiger);

        System.out.println("All cats");
        printAllWithin(repository, Cat.class);

        System.out.println("All Persons");
        printAllWithin(repository, Person.class);

        repository.clear();

    }

    private static <TTarget> void printAllWithin(IRepository repository,
            Class<TTarget> targetClass) {
        for (TTarget currentTarget : repository.findAll(targetClass)) {
            System.out.println(currentTarget);
        }
    }

    static interface IRepository {
        <TTarget> TTarget get(TTarget prototype);

        <TTarget> void store(TTarget target);

        <TTarget> Iterable<TTarget> findAll(Class<TTarget> targetClass);

        void clear();

    }

    static class Db4oRepository implements IRepository {

        ObjectContainer objectContainer;

        public Db4oRepository() {
            this.objectContainer = Db4o.openFile(getClass().getName() + ".yap");
        }

        @Override
        @SuppressWarnings("unchecked")
        public <TTarget> TTarget get(TTarget prototype) {
            ObjectSet<Object> objectSet = this.objectContainer
                    .queryByExample(prototype);
            if (objectSet.size() == 0) {
                return null;
            } else if (objectSet.size() == 1) {
                return (TTarget) objectSet.next();
            } else {
                throw new AmbiguousMatchException();
            }
        }

        @Override
        public <TTarget> void store(TTarget target) {
            this.objectContainer.store(target);
        }

        @Override
        public void clear() {
            this.objectContainer.ext().rollback();
            this.objectContainer.close();

        }

        @Override
        public <TTarget> Iterable<TTarget> findAll(Class<TTarget> targetClass) {
            return new IterableIterator<TTarget>(this.objectContainer.query(
                    targetClass).iterator());
        }

    }

    static class AmbiguousMatchException extends RuntimeException {
    }

    static class Person {

        int id;
        String name;

        public Person() {
            super();
            // TODO Auto-generated constructor stub
        }

        public Person(int id, String name) {
            super();
            this.id = id;
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return this.id + " " + this.name;
        }
    }

    static class Cat {
        String name;

        public Cat() {
            super();
            // TODO Auto-generated constructor stub
        }

        public Cat(String name) {
            super();
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return this.name;
        }
    }

    static class IterableIterator<T> implements Iterable<T> {

        Iterator<T> iterator;

        public IterableIterator(Iterator<T> iterator) {
            super();
            this.iterator = iterator;
        }

        @Override
        public Iterator<T> iterator() {
            return iterator;
        }

    }

}

Gruß Tom
 
Zurück