Ich hatte immer das Gefühl, dass die Hauptarbeit einer Klasse im Allgemeinen in ihren Instanzmethoden geleistet werden sollte, während der Konstruktor die Instanz nur in einen gebrauchsfähigen Anfangszustand bringen sollte.Jedes Problem mit der Hauptarbeit einer Klasse in ihrem Konstruktor?
Aber ich finde, dass es in der Praxis Situationen gibt, in denen es sinnvoller scheint, im Wesentlichen die gesamte tatsächliche Arbeit in den Konstruktor zu stellen.
Ein Beispiel: Ich muss einige DBMS-spezifische Informationen aus der Datenbank abrufen. Der natürlichste Weg schien mir eine Klasse DBMSSpecInfo zu haben, mit einem Konstruktor:
public DBMSSpecInfo(java.sql.Connection conn) throws SQLException{
// ... retrieve info from DBMS
}
/** @returns max size of table in kiB */
public int getMaxTableSize() {//...}
/** @returns max size of index in kiB */
public int getMaxIndexSize() {//...}
/** @returns name of default schema */
public String getDefaultSchema() {//...}
Sie einmal, um die Klasse zu konstruieren, würde der Konstrukteur alle Daten holen, dann können Sie verschiedene Getter verwenden, um die Informationen, die Sie abrufen müssen .
Natürlich könnte ich die Methode woanders setzen und nur DBMSSpecInfo
für den Rückgabewert verwenden (im Wesentlichen mit DBMSSpecInfo nur als Werthalter), aber es fühlt sich hässlich an, eine Klasse nur für die Rückgabe von Werten aus einer einzigen Funktion zu erstellen.
Also was denkst du? Gibt es Probleme beim Ausführen der Hauptarbeit im Konstruktor? Ist es in Java "un-idiomatisch"? Oder ist es eine akzeptable (wenn auch möglicherweise ungewöhnliche) Übung?
+1 In der Tat, das ist genau das, was ich getan habe. Ich habe gerade den Konstruktor von DBMSSpecInfo public gemacht, aber da es nur ein Wert containert (nur 'public final' Felder + Konstruktor) ist, ist es in anderen Instanzen nicht schädlich. Ein öffentlicher Konstruktor hilft auch, wenn Sie Instanzen mit vorgegebenen Werten für Unit-Tests anderer Methoden benötigen. – sleske
Dies ist der vernünftigste Kompromiss - zerstört die Verkapselung nicht, erlaubt aber immer noch relativ einfache Gerätetests. Aber ich denke immer noch, dass Dinge nur verspottet werden sollten. –
Ja, wie Sie erwähnen, wenn Sie Instanzen mit Standardwerten für Komponententests benötigen, ist es in Ordnung, einen öffentlichen Konstruktor zu haben. Das hat aber auch mit der Funktionalität zu tun, die Sie anwenden möchten. In vielen Fällen möchten Sie sicher sein, dass eine bestimmte Objektinstanz mit allen korrekten Informationen erstellt wurde. Denken Sie zum Beispiel an DataRow. In diesem Fall würde ich privaten oder internen Konstrukteuren wärmstens empfehlen. – Dummy01