Por defecto el método de valor de retorno en las interfaces Java

Mientras se trabaja con las anotaciones que me topé en el siguiente fragmento de código (es la Hibernación @NotNull anotación):

@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 acerca de la default palabra clave/construir en la definición de método, que nunca he visto antes. Por lo que he entendido, permite definir un valor predeterminado para este método (o anotación de los bienes).

Ahora yo estaba tratando de aplicar este concepto a una interfaz, pero no pudo. Esto produciría un error de compilación:

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

Pero esto iba a funcionar:

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

Así que mi pregunta es: Es el default palabra clave anotación específica? Y si sí, lo que habla en contra del uso de esta construcción en normal definiciones de interfaz?

OriginalEl autor MicSim | 2010-09-29

2 Kommentare

  1. 20

    Java 8 y a partir de

    Sí, la palabra clave default puede ser utilizado en las interfaces. Para más detalles, véase la Oracle docs.

    La aplicación es un poco diferente de lo que estábamos pensando. Sería:

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

    Java 7 y anteriores

    La palabra clave default sólo puede ser utilizado para anotaciones.

    Si quieres un predeterminado valor de retorno de una interfaz que usted necesita para utilizar una clase abstracta en su lugar.

    public abstract class DefaultTest {
    
      public String test() {
        return "value";
      }
    
    }
    La interfaz de múltiples herencia tiene perfecto sentido. Gracias por señalarlo.
    Resulta que en realidad eran visionarios. Java 8 ahora te permite hacer lo que quieras! He actualizado mi respuesta.

    OriginalEl autor Pace

  2. 6

    El ‘default’ de la palabra clave aquí no es la anotación específica.
    La característica de java para proporcionar implementación predeterminada para la interfaz de los métodos.

    Necesidad de este tipo de comportamiento :
    Supongamos inicialmente una interfaz de Vehículo se ha definido para apoyar a todos funcional de los vehículos métodos –

    interface Vehicle {
      void speed();
    
      ... 
      //other interface methods
    } 

    Ahora clases que implementan esta interfaz del Vehículo han implementado los métodos abstractos.

    Ahora en el futuro el Vehículo tiene la capacidad de volar. Por lo que necesita para añadir volando característica.
    Ahora bien, si usted agregar flyingSpeed() el método para la interfaz del Vehículo, es necesario modificar todas las clases existentes para evitar romper el código.
    No es una solución factible.

    Para la compatibilidad con versiones anteriores de java ha proporcionado una de las características del método Predeterminado. Así que usted puede añadir nuevos métodos a la interfaz con la implementación predeterminada, por lo que las clases existentes no sería necesario implementar ese método. Y las nuevas clases de Vehículos puede reemplazar los métodos de acuerdo a su necesidad.

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

    Usando de esta manera anterior de las clases existentes de Vehículo no necesita implementar este método.

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

    OriginalEl autor gtm.r

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea