2010-09-29 12 views
10

Al trabajar con anotaciones Me topé cruzando el siguiente fragmento de código (que es la anotación de Hibernate @NotNull):predeterminado valor de retorno del método en Java interconecta

@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) 
@Retention(value = RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy = {}) 
public @interface NotNull { 

    @Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) 
    @Retention(value = RetentionPolicy.RUNTIME) 
    @Documented 
    public @interface List { 

     public NotNull[] value(); 
    } 

    public String message() default "{javax.validation.constraints.NotNull.message}"; 

    public Class<?>[] groups() default {}; 

    public Class<? extends Payload>[] payload() default {}; 
} 

Me preguntaba sobre la palabra clave default/construir en el método definición, que nunca he visto antes. Según entendí, te permite definir un valor predeterminado para este método (o propiedad de anotación).

Ahora estaba tratando de aplicar esta construcción a una interfaz normal, pero falló. Esto sería un fracaso para compilar:

public interface DefaultTest { 
    public String test() default "value"; 
} 

Pero esto funcionaría:

public @interface DefaultTest { 
    public String test() default "value"; 
} 

Así que mi pregunta es: ¿Está el default palabra clave anotación específica? Y si es así, ¿qué se opone a usar esta construcción en las definiciones de interfaz normales?

Respuesta

16

Java 8 y en adelante

Sí, la palabra clave por defecto ahora se puede utilizar en las interfaces. Para más detalles, vea Oracle's docs.

La implementación es ligeramente diferente de lo que estaba pensando. Sería:

public interface DefaultTest { 
    default public String test() { 
     return "value"; 
    } 
} 

Java 7 y anterior

La palabra clave por defecto sólo se puede utilizar para las anotaciones.

Si desea un valor de retorno predeterminado para una interfaz, debe usar una clase abstracta en su lugar.

public abstract class DefaultTest { 

    public String test() { 
    return "value"; 
    } 

} 
+1

La herencia de interfaz múltiple tiene mucho sentido. Gracias por señalar esto. – MicSim

+0

Resulta que en realidad eras profético. ¡Java 8 ahora te permite hacer lo que quieras! He actualizado mi respuesta. – Pace

3

La palabra clave 'predeterminada' aquí no es específica de la anotación. Es la característica de java para proporcionar implementación predeterminada a los métodos de interfaz.

Necesidad de este comportamiento: Supongamos inicialmente una interfaz de vehículo se definió para apoyar a todos los métodos funcionales de vehículos -

interface Vehicle { 
    void speed(); 

    ... 
    //other interface methods 
} 

Ahora las clases que implementan esta interfaz del vehículo han puesto en práctica esos métodos abstractos.

Ahora en el futuro Los vehículos tienen la capacidad de volar. Por lo tanto, debe agregar la función de vuelo también. Ahora, si agrega el método flyingSpeed ​​() a la interfaz del vehículo, debe modificar todas las clases existentes para evitar romper el código. Solución no factible.

Para compatibilidad con versiones anteriores, java ha proporcionado la función del método predeterminado. Para que pueda agregar nuevos métodos para interactuar con la implementación predeterminada, entonces las clases existentes no necesitarían implementar ese método. Y las nuevas clases de vehículos pueden anular esos métodos según su necesidad.

interface Vehicle { 
    void speed(); 

    ... 
    //other interface methods 

    //default method 
    default void flyingSpeed() { 
    System.out.println("Default flying speed"); 
    } 
} 

De esta manera, las clases anteriores de vehículos no necesitarían implementar este método.

Para obtener más información see aquí.

Cuestiones relacionadas