2010-01-25 15 views

Respuesta

63

¿Dónde encontraste el trozo de código que has publicado, cualquier código base de Java?
Esto es lo que el JLS tiene que decir:

9.1.1.1 Interfaces abstractas:
Cada interfaz es implícitamente abstracta. Este modificador está obsoleto y no debe usarse en nuevos programas.

9.4 Declaraciones método abstracto:
Para la compatibilidad con versiones anteriores de la plataforma Java, es permitido pero desanimados, como una cuestión de estilo, especificar redundantemente el modificador abstract para los métodos declarados en las interfaces.

+4

Un ejemplo de GWT 2.0: D –

+2

@Sudhir, googleando para el fragmento de código que publicó Encontré este hilo de correo donde se discute el mismo problema: http://osdir.com/ml/Google-Web-Toolkit/2010- 01/msg00452.html También vea: http://osdir.com/ml/Google-Web-Toolkit/2010-01/msg00516.html donde se menciona una explicación probable del uso. (parafraseando: lo que comenzó como una clase abstracta pudo haberse cambiado para interactuar con el modificador anterior que no se eliminó) – sateesh

+0

Hmmm ... eso lo explicaría. –

2

Normalmente, no declara la interfaz, o sus métodos, como abstractos. Ellos están implícitamente.

Los métodos también son públicos, por lo que puede omitir eso también. :-)

26

Las interfaces y los métodos de interfaz son implícitamente abstract aunque no estén declarados como tal. Entonces no hay necesidad de especificarlo explícitamente.

+4

Todos los métodos de interfaz son también implícitamente 'public', por lo que se declara como tales redundante también. –

+0

Lo mismo vale para el "público" en el método: está implícito y no es necesario. –

+0

"public" lo hace más explícito y es bueno para legibilidad IMO. El resumen no tiene sentido en este contexto. –

0

El comportamiento predeterminado de una interfaz es esencialmente equivalente a lo que tiene en su ejemplo. Definirlo como abstracto es simplemente redundante.

0

creo que acaba de verbosidad, explicitud y la coherencia con la sintaxis y la semántica de clase ...

Usted no tiene que hacerlo, pero tal vez podría ayudar si algún lector de su código se distrae o no muy versado en Java.

+0

¿No es lo contrario (como lo demuestra este hilo). Si alguien está escribiendo una interfaz, debe saber qué es una interfaz. OMI esto es más confuso. –

+0

Si el código no es solo para usted, debe escribir pensando en los demás. – fortran

4

Hace la diferencia: las interfaces y los métodos de interfaz son siempre abstractos, pero no es necesario agregar el modificador (y los métodos de interfaz siempre son públicos, por lo que no necesita el modificador público).

Desde el JLS:

9.1.1.1 Interfaces abstractas

Cada interfaz es implícitamente abstracta. Este modificador está obsoleto y no debería ser utilizado en programas nuevos.

0

No tiene sentido declarar que la interfaz es abstracta. Como los métodos en la interfaz son abstractos solo ... Una clase abstracta más puede tener tanto métodos abstractos como concretos, pero en la interfaz solo debe haber métodos abstractos.

+0

si recuerdo bien, una interfaz puede tener métodos concretos (estáticos). – fortran

0

El modificador abstracto para un método de interfaz siempre es redundante, así como el modificador pública.

El modificador abstracto en la interfaz en sí mismo puede ser redundante por una razón técnica estricta, ya que una interfaz nunca puede crearse una instancia utilizando el nuevo operador y la interfaz siempre será abstracta si se solicita a través de la reflexión.

Sin embargo, puede haber una razón semántica para declarar un resumen de interfaz (que también es compatible con varias herramientas UML): Es posible que desee expresar que una interfaz se declara explícitamente abstracta en la forma que una clase no abstracta no puede implementar la interfaz directamente, sino solo a través de una interfaz secundaria. Por ejemplo, podría considerar el Nodo de interfaz como semánticamente abstracto, mientras que las subinterfaces Carpeta y Archivo que extienden el Nodo no son semánticamente abstractas. Nunca tendrá una instancia que sea solo un nodo: será una carpeta o un archivo.

Aún más hay frameworks que permiten la "instanciación" de interfaces (técnicamente a través de proxies dinámicos). Hay alguna interfaz (por ejemplo, una interfaz base predefinida) que no puede suministrar como argumento. Para fines de documentación puede tener sentido en el código fuente usar el modificador abstracto para expresar dicha información.

0

"¿Por qué declarar una interfaz como abstracta?" - Recibí la misma pregunta y pensé que el resumen es redundante. Pero tuvo que replantearse cuando vi la interfaz del mapa en Java 1.8.May ser esto tiene que ser cambiado en Java

// (version 1.8 : 52.0, no super bit) 
// Signature: <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object; 
public abstract interface java.util.Map { 

    // Method descriptor #1()I 
    public abstract int size(); 
} 
Cuestiones relacionadas