2010-01-27 14 views
12

Sé que en Java no podemos extender una clase final. Pero, ¿hay alguna forma alternativa en la que obtenga el efecto de extender una clase final?Equivalente a extender una clase final en Java

Porque tengo una clase final con los requisitos que estoy buscando, así que si de alguna manera puedo reutilizar esto, sería de gran ayuda para mí.

Respuesta

27

¿Crear un contenedor para la clase final?

Algo como esto:

class MyClass { 
    private FinalClass finalClass; 

    public MyClass { 
     finalClass = new FinalClass(): 
    } 

    public void delegatingMethod() { 
     finalClass.delegatingMethod(); 
    } 
} 

Una clase contenedora como MyClass no será aceptada como una instancia de FinalClass. Si FinalClass implementa cualquier interfaz, puede implementarla en MyClass para hacer que las clases sean más parecidas. Lo mismo es cierto para cualquier padre no final del FinalClass; en ese caso, su diseño MyClass debería ser compatible con esas clases principales.

Incluso es posible crear una clase contenedora durante el tiempo de ejecución mediante reflexión. En ese caso, puede usar el Proxy class. Tenga en cuenta que las clases de proxy requieren un conocimiento profundo sobre el sistema de tipo Java.

+1

En la práctica, esto solo funciona si la clase que se envuelve implementa algún tipo de clase de interfaz/resumen y puede proporcionar una instancia de contenedor en lugar del original. Si no puede hacer ninguno de estos, entonces esto es difícil de hacer sin refactorizar el original. –

+0

Por supuesto, no puede reemplazar todas las instancias de FinalClass con MyClass. Pero puede definir su propia interfaz para envolver FinalClass con MyClass. Simplemente nunca haga referencia a FinalClass fuera de MyClass. – Arne

+0

@ArneJan, ¿quisiste decir que no debería referirme al campo 'finalClass' en ninguna otra clase? ¿Por qué? –

3

La opción más simple sería escribir un contenedor, que contiene una instancia de la clase final como variable miembro y actúa como un proxy para la clase final.

De esta manera, es fácil anular o ampliar los métodos de la clase final.

Cuestiones relacionadas