2008-10-02 15 views
255

¿Deben declararse los métodos en una interfaz Java con o sin el modificador de acceso public?¿Deben declararse los métodos en una interfaz Java con o sin un modificador de acceso público?

Técnicamente, no importa, por supuesto. Un método de clase que implementa un interface siempre es public. Pero, ¿qué es una mejor convención?

Java en sí no es consistente en esto. Véase, por ejemplo, Collection frente a Comparable, o Future frente a ScriptEngine.

+19

Es malo porque escribirlo como público implica que * puede * no ser público – Pacerier

+6

Debe evitar la sintaxis redundante de cualquier forma. – EJP

+6

Votación para reabrir porque no está "basada en opiniones", el JLS (particularmente [sección 9.4] (http: // docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.4)) es claro al respecto. La respuesta correcta y concreta es: está permitido pero desaconsejado. –

Respuesta

302

El JLS deja esto claro:

Está permitido, pero desalentado como una cuestión de estilo, para especificar de forma redundante la public y/o abstract modificador de un método declarado en una interfaz.

+1

El enlace JLS anterior era para Java 7 en el momento en que lo leí. Después de los comentarios sobre Java 9 que permiten métodos que no son públicos, solo quería confirmar que todavía hay una redacción muy similar para [SE9 JLS] (https://docs.oracle.com/javase/specs/jls/se9/html/ jls-9.html # jls-9.4). (la parte 'public' es la misma, la parte' y/o abstract' ha sido eliminada) – OzgurH

4

Siempre escribo lo que usaría si no hubiera interfaz y estuviera escribiendo una implementación directa, es decir, usaría public.

+4

¿También declararía explícitamente que todos los métodos de interfaz son abstractos? –

+4

Es una interfaz, no una clase abstracta. En lo que respecta a 'público', son 7 caracteres que has tipeado cuando lo piensas, ¡gran cosa! Y así es como se definirá también en la implementación, que es +1 para la coherencia equilibrando el -1 para la redundancia. – JeeBee

37

El modificador público se debe omitir en las interfaces Java (en mi opinión).

Dado que no agrega ninguna información adicional, simplemente desvía la atención de las cosas importantes.

La mayoría de las guías de estilo le recomendarán que lo deje de lado, pero por supuesto, lo más importante es ser coherente en toda la base de código, y especialmente para cada interfaz. El siguiente ejemplo podría confundir fácilmente a alguien que no es 100% fluido en Java:

public interface Foo{ 
    public void MakeFoo(); 
    void PerformBar(); 
} 
+3

¿Tiene un enlace a tal guía de estilo? –

+6

La consistencia es, con mucho, lo más importante, y es la respuesta al 99% de este tipo de preguntas. – SCdF

+0

De acuerdo con la coherencia. Algo para sus estándares de codificación documentos chicos :) – JeeBee

4

Evitaría poner modificadores que se apliquen de forma predeterminada. Como se señaló, puede provocar incoherencia y confusión.

Lo peor que vi es una interfaz con métodos declarados abstract ...

1

Es totalmente subjetiva. Omito el modificador public redundante, ya que parece desorden. Como lo mencionaron otros, la consistencia es la clave de esta decisión.

Es interesante observar que los diseñadores del lenguaje C# decidieron hacer cumplir esto. Declarar un método de interfaz como público en C# es en realidad un error de compilación. Sin embargo, la consistencia probablemente no es importante en todos los idiomas, así que supongo que esto no es realmente relevante para Java.

5

Usé declare métodos con el modificador public, porque hace que el código sea más legible, especialmente con resaltado de sintaxis. Sin embargo, en nuestro último proyecto, utilizamos Checkstyle, que muestra una advertencia con la configuración predeterminada para los modificadores public en los métodos de interfaz, así que cambié a omitirlos.

Así que no estoy seguro de qué es lo mejor, pero una cosa que realmente no me gusta es usar public abstract en métodos de interfaz. Eclipse hace esto a veces cuando se refactoriza con "Extract Interface".

+2

Pero solo si marca las dos casillas de verificación, declare los métodos como públicos, abstractos. – MetroidFan2002

3

Prefiero omitirlo, leí en alguna parte que las interfaces son por defecto, public y abstract.

Para mi sorpresa, el libro - Head First Design Patterns, está usando public con declaración de interfaz y métodos de interfaz ... que me hizo repensar una vez más y me conecté a esta publicación.

De todos modos, creo que la información redundante debe ser ignorada.

+1

Solo para aclarar, si omite el modificador de acceso 'public' en la declaración de la interfaz, ** ** será público y abstracto por defecto. http://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html – Jabbslad

-9

Las personas aprenderán su interfaz de la finalización del código en su IDE o en Javadoc, no de leer la fuente. Entonces no tiene sentido poner "público" en la fuente, nadie está leyendo la fuente.

+6

Realmente tengo que estar en desacuerdo con la afirmación de que nadie está leyendo la fuente. Creo que mucha gente usa, por ejemplo, F3 en Eclipse para acercarse al código. Herramientas como Maven ofrecen la opción de descargar las fuentes, no solo JavaDoc, por una razón. –

+0

Esa no es la razón exacta para no agregar un modificador de acceso 'public' a una interfaz. Es por diseño y después de un pensamiento cuidadoso detrás de él. – mtk

3

El motivo de que los métodos en las interfaces sean por defecto públicos y abstractos parece bastante lógico y obvio para mí.

Un método en una interfaz por abstracción es forzar a la clase implementadora a proporcionar una implementación y es público por defecto para que la clase implementadora tenga acceso para hacerlo.

Agregar esos modificadores en su código es redundante e inútil y solo puede llevar a la conclusión de que usted carece de conocimiento y/o comprensión de los fundamentos de Java.

7

A pesar de que esta pregunta se ha formulado hace mucho tiempo, pero creo que una descripción exhaustiva aclararía por qué no es necesario utilizar el resumen público antes de los métodos y el final público estático antes de las constantes de una interfaz.

En primer lugar, las interfaces se utilizan para especificar métodos comunes para un conjunto de clases no relacionadas para las cuales cada clase tendrá una implementación única. Por lo tanto, no es posible especificar el modificador de acceso como privado ya que no se puede acceder por otras clases para que se anule.

Segundo, aunque uno puede iniciar objetos de un tipo de interfaz, pero las clases que lo implementan y no heredan una interfaz. Y dado que una interfaz puede ser implementada (realizada) por diferentes clases no relacionadas que no están en el mismo paquete, el modificador de acceso protegido tampoco es válido. Entonces, para el modificador de acceso solo nos queda una opción pública.

En tercer lugar, una interfaz no tiene ninguna implementación de datos, incluidas las variables y métodos de instancia. Si hay una razón lógica para insertar métodos implementados o variables de instancia en una interfaz, entonces debe ser una superclase en una jerarquía de herencia y no una interfaz. Teniendo en cuenta este hecho, dado que no se puede implementar ningún método en una interfaz, todos los métodos en la interfaz deben ser abstractos.

En cuarto lugar, la interfaz solo puede incluir constante como sus miembros de datos, lo que significa que deben ser finales y, por supuesto, las constantes finales se declaran como estáticas para mantener solo una instancia de ellas. Por lo tanto, la estática final también es imprescindible para las constantes de interfaz.

Por lo tanto, en conclusión, aunque se utiliza el resumen público antes de los métodos y final estático público antes de que las constantes de una interfaz sean válidas, dado que no hay otras opciones, se considera redundante y no se utiliza.

2

Con la introducción de private, static, default modificadores de métodos de interfaz en Java 8/9, las cosas se complican más y yo tienden a pensar que las declaraciones completas son más legible (necesita Java para compilar 9):

public interface MyInterface { 

    //minimal 
    int CONST00 = 0; 
    void method00(); 
    static void method01() {} 
    default void method02() {} 
    private static void method03() {} 
    private void method04() {} 

    //full 
    public static final int CONST10 = 0; 
    public abstract void method10(); 
    public static void method11() {} 
    public default void method12() {} 
    private static void method13() {} 
    private void method14() {} 

} 
Cuestiones relacionadas