2011-02-14 5 views
7

Me gustaría desaprobar solo la extensión de una clase dada, no todos los métodos y campos contenidos dentro de una clase, usando la anotación @Deprecated.Deprecate la herencia de clase solo

Es decir, se producirá una advertencia si extiende una clase determinada, pero las referencias a métodos o campos no activarán una advertencia. Ya hay varias clases que extienden esta clase, y quiero que las advertencias de desaprobación se dirijan a estos clientes; todavía no puedo descifrarlas (pero pueden recompilarse). No es necesaria la compatibilidad ABI.

¿Es posible en Java 1.6 (compilador JDT)?

+0

Como actualización, dado las respuestas hasta ahora, necesito permitir que las clases continúen ampliando la clase, ya que aún no puedo eliminar la dependencia, pero quiero que reciban advertencias de desaprobación al hacerlo. – BeeOnRope

+1

Gracias por las respuestas. Al final, ninguna de las siguientes soluciones fue totalmente adecuada (el uso de final no es inicial, porque quiero advertir, no interrumpir), así que me conformé con desaprobar los constructores protegidos que deben usar las subclases, que tenían una similar efecto (una advertencia de desaprobación por extensión). – BeeOnRope

Respuesta

5

Dos consideraciones

1) La clase ya se puede prolongar, por lo que no se marca final o se podría romper la compatibilidad hacia atrás.

2) No desea que la clase se extienda, por lo que debe marcarse como final.

Creo que lo que debes hacer es extender la clase anterior con una nueva clase, marcar la clase obsoleta obsoleta y declarar la nueva clase como definitiva. En la nueva clase, puede agregar la etiqueta @SuppressWarning para silenciar el mensaje en desuso, luego debe obtener una compilación limpia.

El código que usa la clase anterior recibirá una advertencia @Deprecated, pero aún así compilará ... El código que usa la nueva clase se compilará limpiamente. Es una especie de "sugerencia fuerte" para sus usuarios en lugar de un salto compatible con versiones anteriores, y es bastante fácil de solucionar, ya que la API es 100% compatible.

+0

Marcando esta como la respuesta, ya que es más a lo largo de los tiempos de lo que necesitaba, una forma de advertir a los consumidores sobre la extensión de la clase, sin romperlos o advertir sobre cada invocación de método. – BeeOnRope

4

Dudo que esto sea posible usando la anotación @Deprecated.

Si usted tiene control sobre las fuentes que podría sin embargo hacer lo siguiente:

  1. Cambiar el nombre de la clase actual SomeClass a SomeClassSuper
  2. Crear una nueva clase llamada SomeClass y deje que se extienden SomeClassSuper.
  3. Realice SomeClass final (lo que evita que los clientes lo extiendan).

Es decir, pasar de

class SomeClass { 
    // ... 
} 

class SubClass extends SomeClass { 
    // ... 
} 

a

class SomeClassSuper { 
    // ... 
} 

class SubClass extends SomeClassSuper { 
    // ... 
} 

final class SomeClass extends SomeClassSuper { 
    // ... 
} 
+0

buena idea (+1). – Bozho

1

No, de ninguna manera. Puede hacer la clase final, pero así romperá las extensiones existentes.

Quizás es posible desarrollando un procesador personalizado para la APT. Pero no se aplicará en el caso general.

0

La anotación @Deprecated no es compatible con esto, en su lugar debe marcar su clase final. Si bien esto causa un error del compilador, es más lógico, o bien es seguro extender su clase o es un error hacerlo.

1

Si se ajusta a su diseño, tal vez podría hacer que la funcionalidad necesaria (por ejemplo, constructores a los que los descendientes deben acceder) sea privada, y proporcionar un constructor protegido + obsoleto que las extensiones necesitarían usar.

Cuestiones relacionadas