switch method interfaces implement example java interface java-8 default-implementation

method - public default java



¿Puede un método de interfaz tener un cuerpo? (4)

Desde Java 8 puede definir métodos estáticos en las interfaces además de los métodos predeterminados.

  • Un método estático es un método que está asociado con la clase en la que está definido en lugar de con cualquier objeto. Cada instancia de la clase comparte sus métodos estáticos.

  • Esto facilita la organización de métodos de ayuda en sus bibliotecas; puede mantener métodos estáticos específicos para una interfaz en la misma interfaz en lugar de en una clase separada.

  • El siguiente ejemplo define un método estático que recupera un objeto ZoneId correspondiente a un identificador de zona horaria; usa la zona horaria predeterminada del sistema si no hay ZoneId objeto ZoneId correspondiente al identificador dado. (Como resultado, puede simplificar el método getZonedDateTime )

Aquí está el código:

public interface TimeClient { // ... static public ZoneId getZoneId (String zoneString) { try { return ZoneId.of(zoneString); } catch (DateTimeException e) { System.err.println("Invalid time zone: " + zoneString +"; using default time zone instead."); return ZoneId.systemDefault(); } } default public ZonedDateTime getZonedDateTime(String zoneString) { return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); } }

Ver también

Sé que una interfaz es como una clase abstracta 100% pura. Por lo tanto, no puede tener implementación de método en él. Pero, vi un código extraño. ¿Alguien puede explicarlo?

Fragmento de código:

interface Whoa { public static void doStuff() { System.out.println("This is not default implementation"); } }

EDITAR:

Mi IDE es Intellij Idea 13.1. El proyecto SDK es java 7 <1.7.0_25>. El IDE no muestra ningún error de compilación. Pero, cuando compilo el código en la línea de comandos obtengo el siguiente mensaje.

Whoa.java:2: error: modifier static not allowed here public static void doStuff() { ^


Esto solo es posible en Java 8. En Java 7 Language Specification §9.4 , establece explícitamente:

Es un error en tiempo de compilación si un método declarado en una interfaz se declara estático, porque los métodos estáticos no pueden ser abstractos.

Entonces, en Java 7, los métodos estáticos en las interfaces no pueden existir.

Si vas a la especificación de lenguaje Java 8 §9.4.3 , puedes ver que dice:

Un método estático también tiene un cuerpo de bloque, que proporciona la implementación del método.

Por lo tanto, establece explícitamente que en Java 8, pueden existir.

Incluso traté de ejecutar su código exacto en Java 1.7.0_45, pero me dio el error "modificador estático no permitido aquí".

Aquí hay una cita directamente del tutorial de Java 8 , Métodos por defecto (Aprender el lenguaje Java> Interfaces y herencia) :

Métodos estáticos

Además de los métodos predeterminados, puede definir métodos estáticos en las interfaces. (Un método estático es un método que está asociado con la clase en la que está definido en lugar de con cualquier objeto. Cada instancia de la clase comparte sus métodos estáticos). Esto facilita la organización de métodos de ayuda en sus bibliotecas; puede mantener métodos estáticos específicos para una interfaz en la misma interfaz en lugar de en una clase separada. El siguiente ejemplo define un método estático que recupera un objeto ZoneId correspondiente a un identificador de zona horaria; usa la zona horaria predeterminada del sistema si no hay ZoneId objeto ZoneId correspondiente al identificador dado. (Como resultado, puede simplificar el método getZonedDateTime ):

public interface TimeClient { // ... static public ZoneId getZoneId (String zoneString) { try { return ZoneId.of(zoneString); } catch (DateTimeException e) { System.err.println("Invalid time zone: " + zoneString + "; using default time zone instead."); return ZoneId.systemDefault(); } } default public ZonedDateTime getZonedDateTime(String zoneString) { return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); } }

Al igual que los métodos estáticos en las clases, especifique que una definición de método en una interfaz es un método estático con la palabra clave static al comienzo de la firma del método. Todas las declaraciones de métodos en una interfaz, incluidos los métodos estáticos, son implícitamente public , por lo que puede omitir el modificador public .


Para la versión java 7 o inferior , similarmente funcional se puede lograr utilizando una clase anidada declarada dentro del cuerpo de la interfaz. y esta clase anidada implementa la interfaz externa.

Ejemplo:

interface I1{ public void doSmth(); class DefaultRealizationClass implements I1{ @Override public void doSmth() { System.out.println("default realization"); } } }

¿Cómo lo usamos en nuestro código?

class MyClass implements I1{ @Override public void doSmth() { new I1.DefaultRealizationClass().doSmth(); } }

Por lo tanto, la implementación predeterminada se encapsula dentro de la interfaz.


A partir de Java 9, además de la interfaz de métodos estáticos y por defecto ahora también puede contener métodos privados , que pueden ser muy útiles:

public interface DemoInterface { void ordinaryInterfaceMethod(); default void method1() { print(); } default void method2() { print(); } private void print() { System.out.println("Hello World!"); } }

El método privado no forma parte de la API pública expuesta por una interfaz y puede compartir una funcionalidad común.