Java Übergabe einer Instanz einer Klasse an eine fremde Klasse

PEASANT KING

Commander
Registriert
Okt. 2008
Beiträge
2.412
Hallo Leute,

wirklich schwer klingt das, was mein Titel suggeriert nicht, allerdings stehe ich vor einem Problem.

Ich programmier hobbymäßig eine Software für meine Mutter. Es ist so eine Art Kundenverwaltung mit Extras.
Es wird in Java programmiert. Das Grundprogramm steht und funktioniert auch, allerdings bin ich gerade dabei das Programm zu verbessern, unter anderem gilt das auch für die Datenbank Engine die hinter dem Programm steckt.

Nun habe ich eine Funktion die eine .cfg überprüft, welches Datenbank System verwendet werden soll bspw. MSSQL, MySQL oder sqlite.

Code:
/**
     *
     *
     * @return Die geöffnete SQL Verbindung
     */
    public Object startSQLServerEngine(String[] data) {

        Object dbcontroller;
        String engine;
        
        try {
            engine = cfg.readConfig()[6];

            switch (engine) {
                case "MSSQL":
                    //conn = mssql.getConnection(data);
                    dbcontroller = new MSSQLDBController(data);
                    return dbcontroller;

                case "MySQL":
                    dbcontroller = new MySQLDBController(data);
                    return dbcontroller;
                case "Embedded":
                    //conn = derby.getConnection();
                    return null;
                case "":
                    break;
            }
        } catch (IOException ex) {
            Logger.getLogger(NutriCalcModel.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;

    }

Jetzt möchte ich nicht mehr eine Connection weiter geben an die beteiligten Klassen sodern die DBConnector Klasse selbst, da ich es sinniger finde wenn alles über die Connector Klasse selbst gehandelt wird. Also ich die jeweiligen prepared Statements über die Connector Klasse aufrufe.

Doch wie bewerkstellige ich denn, das ich das Objekt was zurückgegeben wird, in meiner Methode, in einer anderen Klasse wieder so bereit steht, dass ich auf die Methoden der Instanzierten Klasse zugreifen kann ?

Achso, ich würde gern auf Hibernate und andere Alternativen verzichten, denn der Aufwand ist für den derzeitigen Stand der Software nicht im Verhältnis.
 
Zuletzt bearbeitet:
DJ_We$t schrieb:
Doch wie bewerkstellige ich denn, das ich das Objekt was zurückgegeben wird, in meiner Methode, in einer anderen Klasse wieder so bereit steht, dass ich auf die Methoden der Instanzierten Klasse zugreifen kann?

Falls das Objekt immer Instanz einer bestimmten Klasse ist, müssen einfach alle benötigten Methoden und die Klasse selbst, public sein und Du lieferst nicht Objekt zurück, sondern den Klassentyp. Ansonsten würde ich die Klassen ein Interface implementieren lassen und den Interfacetyp zurückgeben.
 
Du könntest ein Interface schreiben, dass von deinen DBController-Klassen implementiert wird und dann entsprechend statt "Object" dein Interface als Rückgabeparameter verwenden. Die aufrunden Klassen können dann die im Interface definierten Methoden verwenden.

Falls deine DBController-Objekte kaum miteinander verwandt sind (was mich wundern würde), kannst du natürlich auch casten.
 
wie wärs mit:

public MSSQLDBController startSQLServerEngine(String[] data) {

MSSQLDBController dbcontroller;

-------------

in den betroffenden klassen änderst du den aufruf dann zu startSQLServerEngine(data).getConnection()
Object als rückgabeobjekt sollte man so gut es geht nie anwenden.
 
Hmm naja also ich hab ja eine MSSQLDBController Klasse eine MySQLDBController Klasse usw. daher weiß ich nicht was ich in der Methode startSQLServerEngie() returnen soll. Ich kann ja immer nur einen Wert überegeben.

EDIT:

@DonnyDepp
Das mit getConnection() sind überbleibsel aus meiner älteren Version des Programms, daher verändere ich es gerade so, das es besser wird.


Also mir wäre lieb, wenn ich eine Instanz der jeweiligen Connector Klasse übergeben könnte.
 
Zuletzt bearbeitet:
Die Funktion muss einfach eine Basisklasse bzw. ein Interface zurückgeben welches alle Methoden bereitstellt die du später benötigst. Die abgeleiteten Klassen müssen das Interface dann einfach bedienen. Denn üblicherweise sollten die spezialisierten Methoden der abgeleiteten Klassen für den Rest uninteressant sein.
 
Hab ich mir schon fast gedacht das ich das erste Mal nicht um Interfaces rum komme. Ich werd mich dann mal ran setzen. Vielen Dank für die Antworten soweit :)
 
DJ_We$t schrieb:
Hmm naja also ich hab ja eine MSSQLDBController Klasse eine MySQLDBController Klasse usw. daher weiß ich nicht was ich in der Methode startSQLServerEngie() returnen soll. Ich kann ja immer nur einen Wert überegeben.

oh lol MSSQLDB und MySQLDB sowas von überlesen ;)

naja, falls du hier nochmal reinschaust,
einfach nach dem aufrufen mit instanceof casten:

Object c = startSQLServerEngine(String[] data);
if (c instanceof MSSQLDBController) {
MSSQLDBController controller = (MSSQLDBController) c;

} else {....}


besser wäre aber eine abstract oberklasse mit einem enum zur typdefinition der im konstruktor der subklassen gesetzt wird.
 
Ich bin dabei meine ganze Anwendung komplett zu überarbeiten, weil ich eine Entwicklerkonsole programmiert habe und darüber das Error Handling abwickle. Dafür musste ich meine Anwendung komplett neu designen. Ganz schön schwer wenn man komplett planlos an die Sache ran geht. Bzw ein Ziel vor Augen hat, aber den Weg dort hin im voraus nicht plant.

Leider stoße ich immer wieder auf designtechnische Fragen zu meiner Anwendung, da ich nie programmieren in einer professionellen Herangehensweise gelernt habe. Ich kenn zwar MVC Pattern usw. naja dennoch fällt es mir recht schwer.

Kurz und knapp habe ich mein Problem anderweitig.
 
Es ist normal, dass man bei etwas komplexeren Programmen ohne vorher ausgearbeitet Konzept viele Dinge doppelt und dreifach neuprogrammieren muss. Einfach nur drauflos programmieren klappt mMn nur bei sehr kleinen Tools, zB einem Directory Lister oder ähnliches.

Wenn du dich informieren willst, wie man Software effizient und zielgerecht plant, dann beschäftige dich mit Software Engineering und Software Architektur. Aber ich warne dich jetzt schon: Das Zeug ist sehr, sehr umfangreich und oft muss man einfach scheitern, damit man hinterher weiß, wie man es besser machen kann.
 
Zurück
Oben