¿Por qué uno declararía un método de interfaz Java como abstracto?


143

Hoy utilicé la función de refactorización de "interfaz de extracción" de Eclipse para crear una interfaz basada en una clase existente. El cuadro de diálogo ofreció crear todos los nuevos métodos de la nueva interfaz como métodos "abstractos".

¿Cuál sería el beneficio de eso?

Pensé que el hecho de que se le permitiera declarar los métodos de interfaz como resumen era una característica superflua e inofensiva del lenguaje que no se recomienda especialmente.

¿Por qué Eclipse apoyaría ese estilo, o por qué alguien elegiría voluntariamente hacerlo?

Aclaración: no estoy preguntando por qué los métodos de interfaz son abstractos, eso es obvio. Me pregunto por qué uno elegiría explícitamente marcarlos como abstractos, ya que si están en una interfaz, de todos modos son abstractos.

Respuestas:


146

De acuerdo con la Especificación del lenguaje Java , la abstractpalabra clave para interfaces es obsoleta y ya no debe usarse. (Sección 9.1.1.1)

Dicho esto, con la propensión de Java a la compatibilidad con versiones anteriores, realmente dudo que alguna vez haga una diferencia si la abstractpalabra clave está presente.


1
Ese fue mi entendimiento (aunque no estaba familiarizado con la sección específica de JLS). Me pregunto por qué Eclipse me ofrecería la opción de crear una marca obselete ...
Uri

Me consiguió. Alguien en algún lugar de visita obligada decidido que era una "característica" deseable y lo puso en Usted sabe, uno de esos tipos de código abierto astutos :).
jdmichal

18
Aunque esta es la respuesta mejor calificada, se refiere a la sección incorrecta de la Especificación; 9.1.1.1 describe la abstractpalabra clave en la declaración de la interfaz en sí, no en sus miembros. La respuesta de @ Will a continuación es correcta y también contiene fuentes de enlaces válidas.
Shaggy Frog

39

"El beneficio de eso" (agregar resumen en la declaración de métodos de interfaz) en eclipse sería un viejo problema de compatibilidad con jdt eclipse compiler en jdk1.3

Desde 1.4, las bibliotecas jdk ya no contienen métodos abstractos predeterminados (en clases abstractas que implementan interfaces).
Esto está engañando el diagnóstico del compilador Eclipse 1.3 ya que su implementación depende de su existencia.
Tenga en cuenta que Javac 1.3 se negaría por completo a realizar frente a las bibliotecas 1.4 (utilizando la opción -bootclasspath).

Dado que es probable que el compilador de Eclipse esté en el nivel de cumplimiento 1.4 (ver Workbench>Preferences>Java>Compiler>JDK Compliance), o use al menos 1.3 bibliotecas de clases si usa el modo de cumplimiento 1.3, la presencia de "resumen" no es necesaria en la mayoría de los proyectos actuales de eclipse.


3
Buen descubrimiento. Por lo tanto, es funcional evitar un problema que ya no existe en el compilador de Eclipse.
jdmichal

1
@jdmichal: exactamente, y también es una respuesta más precisa a la pregunta de Uri.
VonC

39

Del Java SE 7 JLS (Especificación del lenguaje Java): "Está permitido, pero se desaconseja por cuestiones de estilo, especificar de forma redundante el modificador público y / o abstracto para un método declarado en una interfaz".

Para Java SE 5.0 : "Por compatibilidad con versiones anteriores de la plataforma Java, está permitido, pero desaconsejado, por cuestiones de estilo, especificar de forma redundante el modificador abstracto para los métodos declarados en las interfaces".


9

De acuerdo con los métodos JLS, las interfaces son abstractas por defecto, por lo que la palabra clave es redundante. Sabiendo esto, nunca lo usaría para "evitar el desorden de las presentaciones".


Esta debería ser la respuesta correcta. Aquí hay un enlace actualizado - vea la sección "nota"
mork

El JLS no dice que la palabra clave es obsoleta para los métodos en las interfaces. Dice "Está permitido, pero desaconsejado como cuestión de estilo, especificar de forma redundante el modificador público y / o abstracto para un método declarado en una interfaz". JLS # 9.4 .
Marqués de Lorne

@EJP No dije que el JLS declaró que la palabra clave sería obsoleta, esta era mi opinión personal;) ​​Por cierto, notan que esta palabra clave es "redundante", que no es lo mismo que obsoleto, en esto tiene razón, por supuesto . Ahora que sé, editaré la respuesta para aclarar esto.
Daniel Hiller
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.