2009-03-13 4 views
133

Utilicé la función de refactorización de "interfaz de extracción" de Eclipse hoy 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".¿Por qué uno declararía un método de interfaz Java como abstracto?

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

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

¿Por qué Eclipse admitiría tal estilo, o por qué alguien voluntariamente lo haría?

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.

Respuesta

140

De acuerdo con Java Language Specification, la palabra clave abstract para interfaces está obsoleta y ya no se debe usar. (Sección 9.1.1.1)

Dicho esto, con la propensión de Java hacia la compatibilidad con versiones anteriores, realmente dudo que alguna vez marque la diferencia si la palabra clave abstract está presente.

+1

Eso fue lo que entendí (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

+0

Me consiguió. Alguien en algún lugar debe haber decidido que era una "característica" deseable y ponerlo. Ya sabes, uno de esos tipos de fuente abierta astutos :) – jdmichal

+2

tsk tsk ... Sin una advertencia de que es obselete ... – Uri

9

Según JLS, los métodos en las interfaces son abstractos por defecto, por lo que la palabra clave es redundante. Sabiendo esto, nunca lo usaría para "evitar el desorden de presentación".

+0

Esta debería ser la respuesta correcta. Aquí hay un [enlace] actualizado (http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) - vea la "nota" en la sección – mork

+0

. El JLS no dice que la palabra clave está obsoleta para los métodos en las interfaces. Dice "Está permitido, pero desaconsejado como una 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] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.4). – EJP

+0

@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", lo que no es lo mismo que obsoleto, en esto tienes razón de curso. Ahora que sé que editaré la respuesta para aclarar esto. – dhiller

38

"El beneficio de que" (añadiendo abstracta sobre métodos de interfaz declaración) en Eclipse sería un problema de compatibilidad de edad con jdt eclipse compiler in jdk1.3

Desde 1.4, bibliotecas JDK ya no se contiene métodos abstractos por defecto (en clases abstractas implementando interfaces).
Esto engaña al diagnóstico del compilador Eclipse 1.3 ya que su implementación se basa en su existencia.
Tenga en cuenta que Javac 1.3 se rehusaría por completo a funcionar en contra de las bibliotecas 1.4 (usando la opción -bootclasspath).

Desde el compilador Eclipse es probable que sea en 1.4 nivel de cumplimiento (ver Workbench>Preferences>Java>Compiler>JDK Compliance), o utilizar al menos 1,3 bibliotecas de clases si se utiliza 1.3 modo de cumplimiento, la presencia de "abstracto" no es necesaria en la mayor parte de la corriente proyectos de eclipse.

+3

Buen descubrimiento. Por lo tanto, es una funcionalidad para solucionar 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

34

A partir del Java SE 7 JLS (Especificación del lenguaje Java): "Está permitido, pero desaconsejado como una cuestión 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: "Para la compatibilidad con las versiones anteriores de la plataforma Java, está permitido, pero desaconsejado, como una cuestión de estilo, especificar de forma redundante el modificador abstracto para los métodos declarados en las interfaces."

Cuestiones relacionadas