Comenzando con Java 8, los defaultmétodos se introdujeron en las interfaces. Efectivamente, esto significa que no todos los métodos en un interfaceson abstract.
Comenzando con Java 9 (tal vez), privatese permitirán métodos. Esto significa que no todos los métodos en un interfaceson public abstract.
La pregunta "¿Deberían declararse los métodos en una interfaz Java con o sin el publicmodificador de acceso?" se le preguntó en Stack Overflow en /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m
Allí, la mayoría de las respuestas argumentaron que public abstractno debería usarse porque ningún método en un interfacepuede ser otro 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 public abstractusarse las palabras clave en una declaración de método de interfaz Java?
En mi entorno específico, tendremos personas que son ingenieros de software con experiencia, pero que no tienen experiencia en Java, que leen código Java de vez en cuando. Siento que omitir las public abstractpalabras clave ahora creará un punto adicional de confusión para aquellos que no están familiarizados con el historial de cómo las interfaces llegaron a tener diferentes reglas para usar estas palabras clave.
fuente

defaultmodificador o unstaticmodificador es implícitamenteabstract... Está permitido, pero desaconsejado como cuestión de estilo, especificar redundantemente elabstractmodificador para tal declaración de método ". ¿Por qué esperas que las cosas cambien?abstractestá volviendo cada vez más complicada. En Java 9, esa misma oración podría ser: "Un método de interfaz que carece de undefaultmodificador o unstaticmodificador o unprivatemodificador es implícitamente abstracto ..." Además, los argumentos auxiliares para no usar explícitamente las palabras clave, a saber, que todos los métodos de interfaz sonpublic abstract, ahora son discutibles.streamtojava.util.Collection, oMap.getOrDefault(). ¡La alternativa es crear una nueva subinterfaz y hacer que todos se depriman, como Graphics2D, y nadie lo disfrutó!Respuestas:
Para ampliar la respuesta de StackOverflow:
El
publicmodificador de acceso no es necesario porqueEl
abstractmodificador de acceso no es necesario porqueY...
Dado que los métodos predeterminados tienen un cuerpo, y aquellos que no son inherentemente abstractos, y cada declaración de método en una interfaz es inherentemente pública, no necesita especificar ninguna palabra clave.
Uno de los comentarios sobre una respuesta decía:
Un comentario sobre la pregunta de StackOverflow (votado 18 veces) refuta esto:
Las implicaciones del código, especialmente las interfaces, son importantes.
fuente
¿No es suficiente la falta de una implicación de declaración de bloque? ¿Declararías,
extends Objectaunque está implícito?Si el desarrollador no comprende la redundancia, es probable que no comprenda completamente el concepto detrás de la función del lenguaje , que es un problema aún mayor que estar confundido acerca de los 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 debería exponerse a los clientes.
Si declara que un método es privado, está declarando explícitamente que los clientes no deben invocar ese método, lo que en el caso de las interfaces es algo que no se puede inferir fácilmente.
fuente
public abstractantes, a pesar del estilo policial, porque dejó las cosas claras y recordó al lector. Ahora estoy reivindicado porque Java 8 y 9 complican las cosas :-). Java ya es bastante redundante.extends Objecta cada clase que se deriva directamenteObject? Es información que un desarrollador ya debe conocer, por lo que se infiere. Mientras menos información inútil aparezca en la pantalla, más fácil será procesar la información importante. Espero haberte persuadido para que vengas al lado oscuro (¿lo entiendes? Porque las cosas implícitas no se pueden ver). Si no, valió la pena intentarlo jaja. Al final, todo se reduce a lo que hace que el código sea más fácil de administrar para el desarrolladorfinalargumentos de método anteriores a menos que algo divertido lo requiera (como una clase interna anónima, etc.)extends Object, pero definitivamente levantaría una bandera y me haría preguntar por qué. Como mencioné en la publicación, hacer tales cosas podría implicar que el desarrollador puede tener una mala comprensión de cómo funciona algo (puede no saber que todos los objetos ya se extiendenObject, de ahí la extensión explícita)