Ahora que no todas las declaraciones de métodos en una interfaz Java son abstractas públicas, ¿deberían declararse los métodos con estos modificadores?

14

A partir de Java 8, se introdujeron los métodos default en las interfaces. Efectivamente, esto significa que no todos los métodos en un interface son abstract .

A partir de Java 9 (quizás), se permitirán los métodos private . Esto significa que no todos los métodos en un interface son public abstract .

La pregunta "¿Deberían declararse los métodos en una interfaz Java con o sin el modificador de acceso public ?" se le preguntó en Stack Overflow en enlace

Allí, la mayoría de las respuestas argumentaron que no se debería usar public abstract porque ningún método en un interface puede ser otra cosa que no sea public abstract . Ese ya no es el caso.

Entonces, a la luz de estas nuevas características de las interfaces, ¿deberían usarse las palabras clave public abstract en una declaración del método de la interfaz Java?

En mi entorno específico, tendremos personas que son ingenieros de software con experiencia, pero no con experiencia en Java, que leen códigos Java de vez en cuando. Creo que omitir las palabras clave public abstract ahora creará un punto de confusión adicional para aquellos que no estén familiarizados con el historial de cómo las interfaces tuvieron diferentes reglas para usar estas palabras clave.

    
pregunta David Campbell 03.08.2016 - 01:47

2 respuestas

2

Para expandir la respuesta de StackOverflow:

  1. El modificador de acceso public no es necesario porque

      

    Cada declaración de método en el cuerpo de una interfaz es implícitamente pública (§6.6). Se permite, pero se desaconseja por cuestión de estilo, especificar de manera redundante el modificador público para una declaración de método en una interfaz. ( Sección 9.4 )

  2. El modificador de acceso abstract no es necesario porque

      

    Un método predeterminado es un método que se declara en una interfaz con el modificador predeterminado; su cuerpo siempre está representado por un bloque .

    Y ...

      

    Un método de interfaz que carece de un modificador predeterminado o un modificador estático es implícitamente abstracto , por lo que su cuerpo está representado por un punto y coma , no un bloque.

Dado que los métodos predeterminados tienen un cuerpo, y los que no lo son son inherentemente abstractos, y cada declaración de método en una interfaz es inherentemente pública, no es necesario que especifique ninguna palabra clave.

Uno de los comentarios sobre una respuesta dijo:

  

¡No les hagas pensar! Siempre agregué abstractos públicos antes, a pesar del estilo policial, porque aclaró las cosas y recordó al lector. Ahora estoy reivindicado porque Java 8 y 9 complican las cosas (user949300)

Un comentario sobre la pregunta de StackOverflow (18 votos votados arriba) refuta esto:

  

Es malo porque escribirlo como público implica que puede ser no público (Pacerier)

Las implicaciones del código, especialmente las interfaces, son importantes.

    
respondido por el Greg Burghardt 31.01.2017 - 19:15
1

¿No es suficiente la falta de una implicación de declaración de bloque? ¿Declararías extends Object aunque esté implícito?

Si el desarrollador no entiende la redundancia, es probable que no entiendan completamente el concepto detrás de la función de lenguaje , que es un problema aún mayor que el de la confusión modificadores.

El desarrollador debe comprender que el propósito de una interfaz es crear un contrato que defina cómo un cliente puede interactuar con un objeto. Esto sugiere que cualquier método en una interfaz utilizada para la interacción de objetos debe exponerse a los clientes.

Si declara que un método es privado, está indicando explícitamente que el método no está destinado a ser llamado por los clientes, lo que en el caso de las interfaces es algo que no se puede inferir fácilmente.

    
respondido por el Vince Emigh 02.11.2016 - 17:36

Lea otras preguntas en las etiquetas