Tach zusammen!
Ich bin noch neu bei Java und hab deshalb ein paar grundlegende Fragen zur Verwendung von statischen Variablen und Methoden.
In einer Library habe ich eine Klasse die Klassenmethoden besitzt (also als static deklariert). Diese Methoden stellen allgemeine Datenbank-Operationen zur Verfügung auf die ich hier nicht weiter eingehen muss.
Die DB-Verbindung wird in einem ebenfalls statischen Connection-Object gespeichert.
Hier etwas Beispielcode mit einem Konstruktor und der statischen Methode getPlayerListItems, die dazu dient, ein Array direkt von der Datenbank zu füllen.
Der Code an sich funktioniert, nur kann es sein, dass aus der Anwendung die statische Methode aufgerufen wird, bevor conn initialisiert wurde.
Wie gesagt, handelt es sich um eine Library, die ja auch von anderen benutzt werden kann. Deshalb bin ich auf der Suche nach dem passenden Ort um dieses Connection-Objekt zu initialisieren und dabei die OO-Prinzipien (insb. Kapselung) einhalten möchte. Wo mache ich das am besten? Für Aufrufe von Klassenmethoden gibt es ja keine 'Konstruktoren' die vor der ersten Verwendung aufgerufen werden, oder?
Muss ich also eine öffentliche statische Init-Methode schreiben?
Das fände ich eher unsauber, da dann der Entwickler der mit der Bibliothek und dieser Klasse arbeitet selbst dafür sorgen muss, dass er diese Init-Methode vor der ersten Verwendung aufruft. :noe:
Natürlich könnte ich auch in allen statischen Methoden das conn-Objekt auf null prüfen, was bei vielen Methoden aber auch nicht sehr elegant ist. ???:L
Ich muss noch dazu sagen, dass die Herstellung der DB-Verbindung hardkodiert ist, also keine Informationen von 'außen' dafür nötig sind. Wie wird sowas am saubersten in Java realisiert?
Wäre toll, wenn mir jemand weiter helfen könnte.
Gruß!
reinski
Ich bin noch neu bei Java und hab deshalb ein paar grundlegende Fragen zur Verwendung von statischen Variablen und Methoden.
In einer Library habe ich eine Klasse die Klassenmethoden besitzt (also als static deklariert). Diese Methoden stellen allgemeine Datenbank-Operationen zur Verfügung auf die ich hier nicht weiter eingehen muss.
Die DB-Verbindung wird in einem ebenfalls statischen Connection-Object gespeichert.
Hier etwas Beispielcode mit einem Konstruktor und der statischen Methode getPlayerListItems, die dazu dient, ein Array direkt von der Datenbank zu füllen.
Code:
public class clsPlayerDB {
private static Connection conn;
/** Opens the specified player from the database. */
public clsPlayerDB(long playerId) throws SQLException {
ResultSet result;
try {
// SQL statement (uses static Connection object)
java.sql.Statement stmt = conn.createStatement();
result = stmt.executeQuery("SELECT * FROM Player WHERE PlayerID=" + playerId);
result.next();
} catch (SQLException ex) {
ex.printStackTrace();
throw ex;
}
fillFromResultSet(result);
result.close();
}
public static clsListItem[] getPlayerListItems(long clubId) throws SQLException {
ResultSet result;
clsListItem itm[];
int i = 0;
try {
// prepare SQL statements
java.sql.Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
// read all clubs
result = stmt.executeQuery("SELECT * FROM Player WHERE ClubID = " + clubId);
result.last();
i = result.getRow();
if ( i > 0 ) {
itm = new clsListItem[i];
i = 0;
result.beforeFirst();
while (result.next()) {
itm[i++] = new clsListItem(result.getString("FirstName") + " " + result.getString("LastName"), result.getLong("PlayerID"));
}
return itm;
} else {
return null;
}
} catch (SQLException ex) {
ex.fillInStackTrace();
throw ex;
}
}
Wie gesagt, handelt es sich um eine Library, die ja auch von anderen benutzt werden kann. Deshalb bin ich auf der Suche nach dem passenden Ort um dieses Connection-Objekt zu initialisieren und dabei die OO-Prinzipien (insb. Kapselung) einhalten möchte. Wo mache ich das am besten? Für Aufrufe von Klassenmethoden gibt es ja keine 'Konstruktoren' die vor der ersten Verwendung aufgerufen werden, oder?
Muss ich also eine öffentliche statische Init-Methode schreiben?
Das fände ich eher unsauber, da dann der Entwickler der mit der Bibliothek und dieser Klasse arbeitet selbst dafür sorgen muss, dass er diese Init-Methode vor der ersten Verwendung aufruft. :noe:
Natürlich könnte ich auch in allen statischen Methoden das conn-Objekt auf null prüfen, was bei vielen Methoden aber auch nicht sehr elegant ist. ???:L
Ich muss noch dazu sagen, dass die Herstellung der DB-Verbindung hardkodiert ist, also keine Informationen von 'außen' dafür nötig sind. Wie wird sowas am saubersten in Java realisiert?
Wäre toll, wenn mir jemand weiter helfen könnte.
Gruß!
reinski