Interfaz abstracta de Java


197

Considere un ejemplo (que se compila en Java)

public abstract interface Interface {
    public void interfacing();
    public abstract boolean interfacing(boolean really);
}

¿Por qué es necesario que una interfaz sea "declarada" abstracta? ¿Hay otras reglas que se aplican con una interfaz abstracta?


Finalmente: si abstractes obsoleto, ¿por qué está incluido en Java? ¿Hay una historia para la interfaz abstracta?



55
No es un duplicado considerando la parte " Finalmente: .... ".
aioobe

Esta pregunta relacionada cita un ejemplo real: stackoverflow.com/questions/4380796/…
Raedwald

1
¿Y por qué Eclipse agrega 'resumen' por defecto cuando 'extrae la interfaz'?
ModdyFire

@ModdyFire, ¿por favor elabora?
Buhake Sindi

Respuestas:


447

¿Por qué es necesario que una interfaz sea "declarada" abstracta?

No es.

public abstract interface Interface {
       \___.__/
           |
           '----> Neither this...

    public void interfacing();
    public abstract boolean interfacing(boolean really);
           \___.__/
               |
               '----> nor this, are necessary.
}

Las interfaces y sus métodos son implícitamente abstracty agregar ese modificador no hace ninguna diferencia.

¿Hay otras reglas que se aplican con una interfaz abstracta?

No, se aplican las mismas reglas. El método debe ser implementado por cualquier clase de implementación (concreta).

Si el resumen es obsoleto, ¿por qué está incluido en Java? ¿Hay una historia para la interfaz abstracta?

Interesante pregunta. Desenterré la primera edición de JLS, e incluso allí dice "Este modificador está obsoleto y no debe usarse en nuevos programas Java" .

Bien, cavando aún más ... Después de golpear numerosos enlaces rotos, logré encontrar una copia de la especificación original de Oak 0.2 (o "manual"). ¡Lectura bastante interesante, debo decir, y solo 38 páginas en total! :-)

En la Sección 5, Interfaces, proporciona el siguiente ejemplo:

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}

Y en el margen dice

En el futuro, la parte "= 0" de los métodos de declaración en las interfaces puede desaparecer.

Suponiendo que =0fue reemplazado por la abstractpalabra clave, sospecho que abstracten algún momento era obligatorio para los métodos de interfaz.


Artículo relacionado: Java: interfaces abstractas y métodos de interfaz abstracta


3
pero el resumen en sí mismo no es obsoleto, o? Es obsoleto para las interfaces, pero todavía hay clases y métodos abstractos.
user85421

Gracias ;-) Creo que finalmente logré identificar el origen incluso para permitirlo abstractfrente a los métodos de interfaz.
aioobe

13
Guau. Por lo tanto, es obsoleto "por diseño". Esos diseñadores de JLS realmente siempre tuvieron tanto miedo de romper algo, incluso romper cosas que nunca se lanzaron ... :-)
Lukas Eder

@aioobe, debes ser el rastreador web de Google que no conocemos ... jajaja
Buhake Sindi

18
Por cierto. "public" tampoco es necesario en los métodos en una declaración de interfaz ... siempre son públicos.
rec

37

No es necesario, es opcional, al igual que publicen los métodos de interfaz.

Vea el JLS sobre esto:

http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

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

Y

9.4 Declaraciones de métodos abstractos

[...]

Por compatibilidad con versiones anteriores de la plataforma Java, se permite pero se desaconseja, por cuestiones de estilo, especificar redundantemente el modificador abstracto para los métodos declarados en las interfaces.

Está permitido, pero se desaconseja encarecidamente por cuestión de estilo, especificar de forma redundante el modificador público para los métodos de interfaz.


77
a JLS: está permitido, pero desaconsejado, como cuestión de estilo, escribir de forma redundante dos oraciones con el mismo significado y una redacción casi exacta una al lado de la otra ...
n611x007

11

No es necesario declarar el resumen de la interfaz.

Al igual que declarar todos esos métodos públicos (que ya son si la interfaz es pública) o abstractos (que ya están en una interfaz) es redundante.

Sin embargo, nadie te detiene.

Otras cosas que puede declarar explícitamente, pero no necesita:

  • llamar a super () en la primera línea de un constructor
  • extends Object
  • implementar interfaces heredadas

¿Hay otras reglas que se aplican con una interfaz abstracta?

Una interfaz ya es "abstracta". Aplicar esa palabra clave nuevamente no hace absolutamente ninguna diferencia.


2
Aparentemente, los métodos son incluso públicos si la interfaz en sí es privada del paquete.
Thilo

7

Tenga en cuenta que en primavera tiene un significado no académico. La interfaz abstracta es una advertencia al desarrollador para que no la use @Autowired. Espero que spring / eclipse @Autowiredobserve este atributo y advierta / falle sobre el uso de los mismos.

Un ejemplo real: @Service proxy bajo @Transnational a un @Repository necesita usar los mismos métodos básicos, sin embargo, deben usar diferentes interfaces que extiendan esta interfaz abstracta debido a @Autowired. (Llamo a esta interfaz XXXSpec)


+1 buen golpe, busqué una separación de las inyecciones de bean de sesión no pasivables. Tal vez pueda utilizar findbugs / Checkstyle para una regla ....
Grim

3

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

[La especificación del lenguaje Java - 9.1.1.1 abstractInterfaces]

También tenga en cuenta que los métodos de miembro de interfaz son implícitamente public abstract.
[La especificación del lenguaje Java - 9.2 Miembros de la interfaz]

¿Por qué son implícitos esos modificadores? No hay otro modificador (ni siquiera el modificador ' sin modificador ') que sea útil aquí, por lo que no tiene que escribirlo explícitamente.



2

No es necesario, ya que las interfaces son abstractas por defecto, ya que todos los métodos en una interfaz son abstractos.


-2

Una interfaz abstracta no es tan redundante como todo el mundo parece decir, al menos en teoría.

Una interfaz se puede ampliar, al igual que una clase. Si diseña una jerarquía de Interfaz para su aplicación, puede tener una Interfaz 'Base', puede ampliar otras Interfaces desde, pero no desea, como un Objeto en sí mismo.

Ejemplo:

public abstract interface MyBaseInterface {
    public String getName();
}

public interface MyBoat extends MyBaseInterface {
    public String getMastSize();
}

public interface MyDog extends MyBaseInterface {
    public long tinsOfFoodPerDay();
}

No desea que una Clase implemente MyBaseInterface, solo las otras dos, MMyDog y MyBoat, pero ambas interfaces comparten la interfaz MyBaseInterface, por lo que tienen una propiedad 'nombre'.

Sé que es un poco académico, pero pensé que algunos podrían encontrarlo interesante. :-)

En realidad, es solo un 'marcador' en este caso, para indicar a los implementadores de la interfaz que no fue diseñado para implementarse por sí solo. Debo señalar que un compilador (al menos el sun / ora 1.6 con el que lo probé) compila una clase que implementa una interfaz abstracta.


3
Creo que entendiste mal mi pregunta.
Buhake Sindi

3
No estoy de acuerdo con este razonamiento. Creo que cada interfaz debe proporcionar un conjunto de funciones totalmente utilizable y, por lo tanto, cada interfaz se puede implementar por sí sola. Además, no habría razón para que un compilador se niegue a compilar una clase que implementa una interfaz declarada explícitamente como abstracta, porque todas las interfaces ya son implícitamente abstractas. Eso cambiaría por completo el significado de la palabra clave "abstracta".
BladeCoder

-3

Bueno, 'Interfaz abstracta' es una construcción léxica: http://en.wikipedia.org/wiki/Lexical_analysis .

Es requerido por el compilador, también puedes escribir interface.

Bueno, no entres demasiado en la construcción léxica del lenguaje, ya que podrían haberlo puesto allí para resolver alguna ambigüedad de compilación que se denomina casos especiales durante el proceso de compilación o por alguna compatibilidad con versiones anteriores, intenta concentrarte en la construcción léxica central.

La esencia de `interface es capturar algún concepto abstracto (idea / pensamiento / pensamiento de orden superior, etc.) cuya implementación puede variar ... es decir, puede haber implementación múltiple.

Una interfaz es un tipo de datos abstracto puro que representa las características del objeto que está capturando o representando.

Las características se pueden representar por espacio o por tiempo. Cuando están representados por el espacio (almacenamiento de memoria) significa que su clase concreta implementará un campo y método / métodos que operarán en ese campo o por tiempo, lo que significa que la tarea de implementar la característica es puramente computacional (requiere más relojes de CPU para el procesamiento) para que tenga una compensación entre el espacio y el tiempo para la implementación de características.

Si su clase concreta no implementa todas las características, nuevamente se vuelve abstracta porque tiene una implementación de su pensamiento o idea o abstracción pero no está completa, especifíquela por abstractclase.

Una clase concreta será una clase / conjunto de clases que capturará completamente la abstracción que está tratando de capturar la clase XYZ.

Entonces el patrón es

Interface--->Abstract class/Abstract classes(depends)-->Concrete class

1
Esta respuesta no responde a mi pregunta en absoluto. También "It seams like you are new to Java. De Verdad?
Buhake Sindi

"resumen es obsoleto"
Manish

(1) "abstract es obsoleto" -> si lo eliminan y el compilador deja de reconocerlo, entonces la versión anterior del código fuente que usa "interface abstract" no se compilará en la versión más reciente. Necesitan mantener la compatibilidad con versiones anteriores. Cuando define la interfaz abstracta, el significado de la palabra clave de la interfaz está pegado junto con "resumen", que es una versión mucho más limpia, sin embargo, para programadores experimentados como usted, proporcionaron el acceso directo "interfaz" ... su pregunta es similar a i = i + 1 == > i ++ .. la elección es tuya lo que eliges: D
Manish

Mira la respuesta aceptada. Sé que abstractes obsoleto en la interfaz. Quería saber por qué sigue siendo aceptable y cuál es el historial detrás de la abstractinterfaz. Me estás dando una guía de Java 101 sobre resumen vs interfaz.
Buhake Sindi

No es una construcción léxica. Es sintaxis. Semánticamente es redundante. No es "requerido por el compilador". La parte sobre espacio / tiempo es simplemente tonta. Ninguna de estas tonterías responde a la pregunta que se hizo. No use el formato de código para texto que no sea código.
Marqués de Lorne
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.