2010-09-29 16 views
10

Tout en travaillant avec annotations je suis tombé accross la pièce de code suivante (il est l'annotation Hibernate @NotNull):méthode par défaut valeur de retour en Java interfaces

@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 {}; 
} 

Je me demandais sur le mot-clé default/construction dans la méthode définition, que je n'ai jamais vu auparavant. Comme je l'ai compris, il vous permet de définir une valeur par défaut pour cette méthode (ou la propriété d'annotation).

Maintenant j'essayais d'appliquer cette construction à une interface normale, mais elle a échoué. Cela ne permettrait pas de compiler:

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

Mais cela fonctionnerait:

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

Ma question est la suivante: Est-ce l'annotation spécifique à mot-clé default? Et si oui, qu'est-ce qui s'oppose à l'utilisation de cette construction dans les définitions d'interface normales?

Répondre

16

Java 8 et les années suivantes

Oui, le mot-clé par défaut peut maintenant être utilisé sur les interfaces. Pour plus de détails, voir Oracle's docs.

La mise en œuvre est légèrement différente de ce que vous pensiez. Il serait:

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

Java 7 et précédent

Le mot-clé par défaut ne peut être utilisé pour les annotations.

Si vous voulez une valeur de retour par défaut pour une interface, vous devez utiliser une classe abstraite à la place.

public abstract class DefaultTest { 

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

} 
+1

L'héritage à plusieurs interfaces est parfaitement logique. Merci de l'avoir signalé. – MicSim

+0

Il s'avère que vous étiez réellement prescient. Java 8 vous permet maintenant de faire ce que vous voulez! J'ai mis à jour ma réponse. – Pace

3

Le mot clé 'par défaut' ici n'est pas spécifique aux annotations. C'est la caractéristique de Java pour fournir une implémentation par défaut aux méthodes d'interface.

Besoin de ce comportement: On suppose d'abord un véhicule d'interface a été définie pour supporter toutes les méthodes fonctionnelles de véhicules -

interface Vehicle { 
    void speed(); 

    ... 
    //other interface methods 
} 

maintenant des cours de mise en œuvre de cette interface de véhicules ont mis en œuvre ces méthodes abstraites.

Maintenant dans le futur Véhicule a la capacité de voler. Vous devez donc ajouter une fonctionnalité de vol. Maintenant, si vous ajoutez la méthode flyingSpeed ​​() à l'interface véhicule, vous devez modifier toutes les classes existantes pour éviter de casser le code. Solution non réalisable.

Pour la rétrocompatibilité, java a fourni la fonctionnalité de la méthode par défaut. Afin que vous puissiez ajouter de nouvelles méthodes pour s'interfacer avec l'implémentation par défaut, les classes existantes n'auront pas besoin d'implémenter cette méthode. Et les nouvelles classes de véhicules peuvent remplacer ces méthodes selon leurs besoins.De cette manière, les précédentes classes de véhicules existantes n'auraient pas besoin de mettre en œuvre cette méthode.

Pour plus d'informations see ici.