Creare un wrapper per la classe finale?
Qualcosa di simile a questo:
class MyClass {
private FinalClass finalClass;
public MyClass {
finalClass = new FinalClass():
}
public void delegatingMethod() {
finalClass.delegatingMethod();
}
}
una classe wrapper come MyClass
non sarà accettato come un esempio di FinalClass
. Se FinalClass
implementa qualsiasi interfaccia, è possibile implementarle in MyClass
per rendere le classi più simili. Lo stesso vale per i genitori non definitivi di FinalClass
; in tal caso il tuo design MyClass
dovrebbe essere compatibile con quelle classi genitore.
È persino possibile creare una classe wrapper durante il runtime utilizzando reflection. In tal caso è possibile utilizzare lo Proxy
class. Fare attenzione che le classi proxy richiedono una conoscenza approfondita del sistema di tipi Java.
In pratica, tuttavia, questo funziona solo se la classe in fase di wrapping ha implementato un tipo di interfaccia/classe astratta e è possibile fornire un'istanza wrapper al posto dell'originale. Se non riesci a fare nessuno di questi, è difficile farlo senza refactoring dell'originale. –
Ovviamente non è possibile sostituire tutte le istanze di FinalClass con MyClass. Ma puoi definire la tua interfaccia per avvolgere FinalClass con MyClass. Non fare mai riferimento a FinalClass al di fuori di MyClass. – Arne
@ArneJan, volevi dire che non dovrei fare riferimento al campo 'finalClass' in nessun'altra classe? Perché? –