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 hayZoneId
objetoZoneId
correspondiente al identificador dado. (Como resultado, puede simplificar el métodogetZonedDateTime
)
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
Para todas las cosas interesantes en Java 8, lea Todo sobre Java 8
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 hayZoneId
objetoZoneId
correspondiente al identificador dado. (Como resultado, puede simplificar el métodogetZonedDateTime
):
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ícitamentepublic
, por lo que puede omitir el modificadorpublic
.
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.