2010-01-27 13 views
12

So che in Java non è possibile estendere una classe finale. Ma esiste un modo alternativo in cui ottengo l'effetto di estendere una classe finale?Equivalente all'estensione di una classe finale in Java

Perché ho una classe finale con i requisiti che sto cercando, quindi se in qualche modo posso riutilizzare questo, sarebbe di grande aiuto per me.

risposta

27

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.

+1

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. –

+0

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

+0

@ArneJan, volevi dire che non dovrei fare riferimento al campo 'finalClass' in nessun'altra classe? Perché? –

3

L'opzione più semplice sarebbe quella di scrivere un wrapper, che contiene un'istanza della classe finale come variabile membro e funge da proxy per la classe finale.

In questo modo, è facile sovrascrivere o estendere i metodi della classe finale.