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


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

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

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

Author: Edward Brey, 2008-10-02

11 answers

El JLS deja esto claro:

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

 308
Author: Jon Skeet,
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-02-22 09:53:34

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

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

La mayoría de las guías de estilo recomendarán que lo omitas, pero por supuesto, lo más importante es ser consistente en todo tu código base, 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();
}
 38
Author: Rasmus Faber,
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
2008-10-02 10:20:55

A pesar del hecho de que esta pregunta se ha hecho hace mucho tiempo, pero siento que una descripción exhaustiva aclararía por qué no hay necesidad de usar abstract público antes de los métodos y public static final 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 que 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 a él por otras clases para ser anuladas.

Segundo, aunque uno puede iniciar objetos de un tipo de interfaz, pero una interfaz es realizada por las clases que la implementan y no heredada. 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. Así que para el modificador de acceso solo nos queda la opción pública.

Tercero, una interfaz no tiene ningún dato implementación incluyendo 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 ningún método puede ser implementado en una interfaz, todos los métodos en interfaz deben ser abstractos.

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

Así que en conclusión aunque usar métodos public abstract before y public static final before constantes de una interfaz es válido pero ya que no hay otras opciones se considera redundante y no se utiliza.

 8
Author: Leo The Four,
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
2016-03-06 20:52:15

Evitaría poner modificadores que se aplican por defecto. Como se ha señalado, puede dar lugar a incoherencias y confusión.

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

 5
Author: PhiLho,
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
2008-10-02 10:33:00

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

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

 5
Author: cretzel,
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
2008-10-02 10:36:32

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

 4
Author: JeeBee,
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
2008-10-02 10:18:01

La razón por la que los métodos en las interfaces son por defecto públicos y abstractos me parece bastante lógica y obvia.

Un método en una interfaz es por defecto abstracto 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 carece de conocimiento y/o comprensión de los fundamentos de Java.

 3
Author: Iuliana Cosmina,
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-07-31 07:08:23

Prefiero saltarlo, he leído 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... eso me hizo repensar una vez más y aterricé en este post.

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

 3
Author: Pradeep Sharma,
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-03-09 13:46:30

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

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() {}

}
 2
Author: Werner Thumann,
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-07-02 08:31:06

Es totalmente subjetivo. Omito el modificador redundante public ya que parece un desorden. Como han mencionado otros, la coherencia es la clave de esta decisión.

Es interesante notar 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. La consistencia probablemente no es importante en todos los lenguajes, así que supongo que esto no es directamente relevante para Java.

 1
Author: serg10,
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-08-20 22:22:15

La gente aprenderá tu interfaz completando el código en su IDE o en Javadoc, no leyendo el código fuente. Así que no tiene sentido poner "público" en la fuente - nadie está leyendo la fuente.

 -9
Author: Tim Boudreau,
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
2012-03-31 08:12:49