¿Son" público "y" público final " redundantes para los métodos de interfaz?



Estaba leyendo este post ¿Por qué se usaría una interfaz anidada estática en Java? en particular la primera respuesta. En esa respuesta está escrito que el uso de las palabras "público" o "público final" en los campos de interfaz son redundantes. Mi pregunta es: ¿por qué? ¿Por qué debería eliminarlos? Si tengo algo como esto:

public interface Int1 {
   public void add();
   void remove(); 
}

¿No significa que quiero que el método add sea implementado por cualquier clase mientras que el método remove es implementado solo por clases de mi mismo paquete?

Author: Community, 2013-06-09

5 answers

¿Son" público "y" público final " redundantes para los métodos de interfaz?

Sí.

Todos los métodos en una interfaz son implícitamente public y abstract (pero no final).

Todos los campos en una interfaz son implícitamente public, static y final.

La JLS declara esto. También establece que estos modificadores se pueden omitir.


¿Por qué? Bueno, hay una variedad de razones:

  • Los campos y métodos son implícitamente public porque el punto de una interfaz es declarar un ... interfaz que otras clases pueden ver. (Si desea / necesita restringir el acceso, esto se hace a través de un modificador de acceso en la propia interfaz.)

  • Los campos son static porque si no lo fueran estaría declarando campos de instancia visibles en un objeto ... y eso es malo para la encapsulación.

  • Los campos son final porque los campos no finales serían otra forma de declarar public static fields ... que son terrible desde una perspectiva OO.

  • Los métodos son abstract porque permitir cuerpos de métodos efectivamente convertiría las interfaces en clases abstractas.

Otra razón para hacer métodos abstractos y campos estáticos en una interfaz es que si no lo hicieran, la herencia de diamante y la herencia de un método de dos interfaces distintas serían problemáticas.

Pero de cualquier manera, así es como se define Java, por lo que las preguntas son discutibles ... a menos que se pensando en inventar tu propio lenguaje de programación.

Tenga en cuenta que en Java 8, puede declarar métodos en una interfaz, utilizando el modificador default. Y en Java 9, puede declarar private métodos, en algunos casos. Pero el uso de la palabra clave public sigue siendo redundante.


¿por Qué debo eliminarlos?

No tienes que eliminarlos. Al compilador Java no le importa. Usted puede eliminarlos, pero usted no tiene que elimínelos, a menos que esté tratando de ajustarse a algunas pautas de estilo Java que insisten en esto. Hace que su código sea más legible si su código es consistente, pero podría hacerlo consistente utilizando los modificadores redundantes en todas partes.

¿No significa que quiero que el método add sea implementado por cualquier clase mientras que el método remove es implementado solo por clases de mi mismo paquete?

No, no significa eso. O al menos, podría significar que para usted {[54]]}, pero no significará eso para el compilador de Java, otras herramientas de Java ... u otras personas que leen y mantienen su código. OMI, sería desacertado colocar cualquier significado sobre la presencia o ausencia de palabras clave redundantes.

 69
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-14 22:52:55

No puede tener un método final declarado en una interfaz. Los campos son siempre final pero los métodos son siempre abstract (y nunca final). No se puede definir un método de interfaz que deba ser implementado solo por clases en el mismo paquete.* De sección 9.3 de la Especificación del Lenguaje Java :

Cada declaración de campo en el cuerpo de una interfaz es implícitamente pública, estática y final. Se permite especificar redundantemente cualquiera o todos estos modificadores para tales campos.

Y de la sección 9.4:

Toda declaración de método en el cuerpo de una interfaz es implícitamente pública (§6.6).

Cada declaración de método en el cuerpo de una interfaz es implícitamente abstracta, por lo que su cuerpo siempre está representado por un punto y coma, no por un bloque.

Se permite, pero se desaconseja como cuestión de estilo, especificar redundantemente el modificador público y / o abstracto para un método declarado en un interfaz.

* Como señala Paul Bellora en un comentario, puede hacer que la interfaz en sí sea un paquete privado (o protegido, o incluso privado) si desea restringir su visibilidad.

 9
Author: Ted Hopp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-09 16:08:40
  • Las interfaces por definición son abstractas, por lo que el modificador abstracto en la interfaz es redundante.
  • Las variables en interfaces y anotaciones son automáticamente públicas, estáticas y finales, por lo que estos modificadores también son redundantes.
  • Como las anotaciones son una forma de interfaz, sus campos también son automáticamente públicos, estáticos y finales, así como sus campos de anotación son automáticamente públicos y abstractos.
  • Las clases finales por definición no se pueden extender, por lo que la modificador en el método de una clase final es redundante.

Leyendo esto: http://checkstyle.sourceforge.net/config_modifier.html

 2
Author: zedtimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-15 08:08:22

Sí, el público es redundante, porque en un Interface todos los métodos son implícitamente public y abstract.

Creo que es un mal estilo agregar public, o abstract, porque ambos se aplican implícitamente.

public interface Int1 {
   void add();
   void remove(); 
}

Esto se ve más limpio, y muestra que usted sabe, que son implicados público

De Especificación del lenguaje Java (JLS)

9.4. Declaraciones de Métodos abstractos
Cada declaración de método en el cuerpo de una interfaz es implícitamente pública (§6.6).

Toda declaración de método en el cuerpo de una interfaz es implícitamente abstracto, por lo que su cuerpo siempre está representado por un punto y coma, no un bloque.

Se permite, pero se desaconseja como cuestión de estilo, redundantemente especificar el modificador public y / o abstract para un método declarado en interfaz.

 1
Author: AlexWien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-09 16:09:00

Escribo interfaces sin la palabra clave public para los métodos. Es redundante.

 0
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-09 15:55:03