2010-12-14 16 views
13

Cuando estaba analizando un código en mi proyecto, me encontré con esta situación. Tengo una interfaz completa con la declaración de constantes de cadena de la siguiente manera¿Por qué algunos desarrolladores declaran objetos String en sus interfaces en Java y cómo funciona?

public interface SampleInterface { 
    String EXAMPLE_ONE = "exampleOne"; 
    String USER_ID  = "userId"; 

    public void setValue(); 
} 

Si cualquier clase implementa esta interfaz SampleInterface, lo que ocurre con las variables se declara?

  • ¿La clase heredada tiene acceso a todas las variables?
  • ¿La clase implementada necesita anular las declaraciones?
  • ¿Cuál podría ser el propósito de declarar las variables String en una interfaz, cuando podríamos usar una clase abstracta para este propósito?

Además, ¿cuál es la mejor estrategia:

  1. Una clase con los campos estáticos finales y un constructor privado?
  2. ¿Interfaz con las variables como se ve arriba?

Respuesta

26

Es un Java común del idioma

En una interfaz en Java, todos los miembros son implícitamente public, y los campos en particular, son implícitamente public static final. NO tiene otra opción. Si intenta utilizar cualquier otro nivel de permiso que no sea público, el compilador le gritaría, ya que no tendría ningún sentido.

Por lo tanto, cualquier clase implementadora heredará los miembros, incluidos estos campos constantes estáticos, .

¿Por qué las personas usan este idioma?

Existen varias razones por las que haría esto en una interfaz, y por lo general es para usarlo como una tienda constante . Este modismo se utiliza para agrupar constantes en un solo lugar, no necesariamente para tener la interfaz utilizada como parte de un árbol de herencia de una manera OO.

Para que pueda llamar al modo habitual MyInterface.MY_CONST para acceder a una de sus constantes.

Lo haría a través de una interfaz generalmente cuando no necesita ningún comportamiento para ser definido, por lo tanto, cuando no necesita ningún método. Es realmente solo una tienda estática (a menudo, la interfaz también se hace final). También puede usar abstract class para esto, por ejemplo, si desea encapsular y ocultar detalles de una implementación. Pero en este caso, donde tiene tanto campos como métodos, generalmente su objetivo es simplemente proporcionar algunas constantes y un contrato para las subclases.

Teniendo en cuenta que en su caso también hay una firma de método como parte de su interfaz, obviamente existe la intención de implementar esta interfaz.En cuyo caso, todavía se puede acceder a sus datos ya sea como:

  • MyInterface.MY_CONST,
  • o MyExtendingClass.MY_CONST,
  • o instanceOfMyExtendingClass.MY_CONST.

Más información

Para obtener más información, echar un vistazo a:

  • este FAQ entry y los que le siguen,
  • comentarios por Anon y Jeff con respecto a malos usos de este formulario,
  • Enum type as introduced since Java 5 (que, como lo menciona John, en muchos casos d sea ​​una mejor idea: más elegante, con el beneficio adicional de la seguridad de tipo al pasarlo, y utilizando construcciones bastante optimizadas para buscar y manipular los valores).
+0

Su opinión es poner todas las constantes en la interfaz y acceder a ellas durante mi ejecución, supongamos que si alguna clase implementa esta interfaz, ¿qué ocurre con esas variables? – gmhk

+0

Luego puede acceder a ellos a través de 'MyInterface.MY_CONSTANT' o' MyExtendingClass.MY_CONSTANT'. O incluso 'instanceOfMyExtendingClass.MY_CONSTANT', ya que son' public static final'. – haylem

+0

En la clase de implementación, también puede referirse a él como 'MY_CONSTANT' (que es el motivo inicial de toda la" interfaz de constantes "antipatrón). Sin embargo, si eso es específicamente lo que está buscando, la declaración 'import static' fue agregada por una razón. –

Cuestiones relacionadas