las - polimorfismo java
¿Son "públicos" y "públicos finales" redundantes para los métodos de interfaz? (5)
Estaba leyendo esta publicación. ¿Por qué se usaría una interfaz anidada estática en Java? En particular, la primera respuesta. En esa respuesta se escribe que utilizan las palabras "público" o "final pública" en los campos de la interfaz que 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 sea implementado solo por las clases de mi mismo paquete?
¿Son "públicos" y "públicos finales" 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
.
El JLS lo dice. También establece que estos modificadores pueden omitirse.
¿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 una ... 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 estuvieran, 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 camposstatic
public
... que son terribles desde una perspectiva OO.Los métodos son
abstract
porque permitir que los cuerpos de los métodos conviertan efectivamente las interfaces en clases abstractas.
Otra razón para hacer que los métodos sean abstractos y los 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, así que las preguntas son discutibles ... a menos que esté pensando en inventar su 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, puedes declarar métodos private
, en algunos casos. Pero el uso de la palabra clave public
sigue siendo redundante.
¿Por qué debería eliminarlos?
No tienes que quitarlos. El compilador de Java no le importa. Puede eliminarlos, pero no tiene que eliminarlos, a menos que esté tratando de cumplir con algunas pautas de estilo de Java que insisten en esto. Hace que su código sea más legible si su código es consistente, pero usted podría hacerlo de manera consistente utilizando 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 las clases de mi mismo paquete?
No, no significa eso. O al menos, podría significar eso para ti , pero no lo será para el compilador de Java, otras herramientas de Java ... u otras personas que lean y mantengan tu código. En mi opinión, no sería aconsejable colocar ningún significado sobre la presencia o ausencia de palabras clave redundantes.
Escribo interfaces sin la palabra clave public
para los métodos. Es redundante
No se puede tener un método final
declarado en una interfaz. Los campos siempre son final
pero los métodos siempre son abstract
(y nunca son final
). No puede definir un método de interfaz que se implementará solo por clases en el mismo paquete. * De la 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 de forma redundante cualquiera o todos estos modificadores para dichos campos.
y de la sección 9.4 :
Cada 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 por cuestión de estilo, especificar de manera redundante el modificador público y / o abstracto para un método declarado en una interfaz.
* Como señala Paul Bellora en un comentario, puede hacer que la interfaz sea un paquete privado (o protegido, o incluso privado) si desea restringir su visibilidad.
Sí, el público es redundante, porque en una Interface
todos los métodos son implícitamente public
y abstract
.
Creo que es un mal estilo para 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 sabes, que son implícitos públicos
de la especificación de 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).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 por cuestión de estilo, especificar de manera redundante el modificador público y / o abstracto para un método declarado en una interfaz.
- Las interfaces por definición son abstractas, por lo que el modificador abstracto en la interfaz es redundante.
- Las variables en las interfaces y las 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, al igual que sus campos de anotaciones son automáticamente públicos y abstractos.
- Las clases finales por definición no pueden extenderse, por lo que el modificador final en el método de una clase final es redundante.
leyendo esto: http://checkstyle.sourceforge.net/config_modifier.html