Comenzando con Java 8, los default
métodos se introdujeron en las interfaces. Efectivamente, esto significa que no todos los métodos en un interface
son abstract
.
Comenzando con Java 9 (tal vez), private
se permitirán métodos. 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 public
modificador 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 abstract
no debería usarse porque ningún método en un interface
puede 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 abstract
usarse 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 abstract
palabras 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
default
modificador o unstatic
modificador es implícitamenteabstract
... Está permitido, pero desaconsejado como cuestión de estilo, especificar redundantemente elabstract
modificador para tal declaración de método ". ¿Por qué esperas que las cosas cambien?abstract
está volviendo cada vez más complicada. En Java 9, esa misma oración podría ser: "Un método de interfaz que carece de undefault
modificador o unstatic
modificador o unprivate
modificador 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.stream
tojava.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
public
modificador de acceso no es necesario porqueEl
abstract
modificador 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 Object
aunque 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 abstract
antes, 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 Object
a 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 desarrolladorfinal
argumentos 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)