Ho molte classi che recuperano oggetti di database. Ho implementato i loro metodi come statici, in modo che possano essere chiamati così:
class xxxDB {
public static method1(Connection dbcon) {
//...
method2(dbcon, ...);
}
public static method2(Connection dbcon, ....) {
//...
}
// Other specific methods for xxx
}
Mi piace la soluzione dei metodi statici, ma è necessario passare tutto il tempo intorno all'oggetto Connection
a tutti i metodi, e non lo trovo particolarmente chiaro o elegante. Quindi ho valutato diverse opzioni per il refactoring (e ho scartato l'uso di JPA, perché non sono sicuro di come implementarlo nel mio specifico database strano). Uno è quello di evitare statiche e utilizzare una variabile di istanza immutabile in ciascuna delle classi:
class xxxDB {
private final Connection dbcon;
public xxxDB(Connection dbcon) {
this.dbcon = dbcon;
}
public static method1() {
//...
method2(...);
}
// Other specific methods for xxx
}
Ma questo crea un sacco di codice duplicato. Per ogni classe, e ne ho parecchi, devo duplicare l'istanza e il costruttore. La mia idea sarebbe quella di avere una super classe che possa essere estesa da tutti gli altri:
class superDB {
private final Connection dbcon;
private superDB(){}
public superDB(Connection dbcon) {
this.dbcon = dbcon;
}
}
Ma questo mi costringe ancora a ripetere questo codice in ogni classe:
public xxxDB(Connection dbcon) {
this.dbcon = dbcon; // or super(dbcon);
}
Le mie domande sono:
- È davvero una buona idea rifattorizzare i metodi
static
che accedono al database? - C'è un modo / schema per le mie classi di ereditare il "costruttore di un arg" della super classe? Qualcosa come:
.
class superDB {
private final Connection dbcon;
private superDB(){}
public superDB(Connection dbcon) {
this.dbcon = dbcon;
}
}
class xxxDB extends superDB {
// no need to add duplicated code to call the super
public static method1() {
//...
}
// Other specific methods for xxx
}