2010-09-29 12 views
10

Mentre si lavora con le annotazioni mi sono imbattuto attraversato il seguente pezzo di codice (è l'annotazione Hibernate @NotNull):predefinito valore di ritorno del metodo in Java si interfaccia

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

Mi chiedevo circa la parola default/costrutto nel metodo definizione, che non ho mai visto prima. Come ho capito, ti consente di definire un valore predefinito per questo metodo (o la proprietà di annotazione).

Ora stavo cercando di applicare questo costrutto a un'interfaccia normale, ma non è riuscito. Ciò non riuscirebbe a compilare:

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

Ma questo dovrebbe funzionare:

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

Quindi la mia domanda è: È la parola chiave default annotazione-specifico? E se sì, cosa si oppone all'uso di questo costrutto nelle normali definizioni di interfaccia?

risposta

16

Java 8 e poi

Sì, la parola chiave di default può ora essere utilizzato sulle interfacce. Per maggiori dettagli vedi Oracle's docs.

L'implementazione è leggermente diversa da quello che stavi pensando. Sarebbe:

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

Java 7 e precedenti

La parola chiave predefinita può essere utilizzato solo per le annotazioni.

Se si desidera un valore di ritorno predefinito per un'interfaccia, è necessario utilizzare invece una classe astratta.

+1

L'ereditarietà dell'interfaccia multipla ha perfettamente senso. Grazie per averlo indicato. – MicSim

+0

Si scopre che in realtà era preveggente. Java 8 ora ti permette di fare ciò che vuoi! Ho aggiornato la mia risposta. – Pace

3

La parola chiave "predefinita" qui non è specifica dell'annotazione. È la caratteristica di java per fornire un'implementazione predefinita ai metodi di interfaccia.

Necessità di questo comportamento: Supponiamo inizialmente un veicolo interfaccia è stata definita per supportare tutti i metodi funzionali del veicolo -

interface Vehicle { 
    void speed(); 

    ... 
    //other interface methods 
} 

Ora le classi che implementano questa interfaccia di veicoli hanno attuato questi metodi astratti.

Ora in futuro Veicolo con capacità di volo. Quindi è necessario aggiungere funzionalità di volo pure. Ora se si aggiunge il metodo flyingSpeed ​​() all'interfaccia veicolo, è necessario modificare tutte le classi esistenti per evitare di rompere il codice. Soluzione non fattibile.

Per compatibilità con le versioni precedenti, java ha fornito la funzionalità del metodo Predefinito. In modo che è possibile aggiungere nuovi metodi per interfacciare con l'implementazione predefinita, quindi le classi esistenti non avrebbero bisogno di implementare tale metodo. E le nuove classi di veicoli possono scavalcare quei metodi secondo le loro necessità.

interface Vehicle { 
    void speed(); 

    ... 
    //other interface methods 

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

Utilizzando in questo modo le precedenti classi di veicoli esistenti non avrebbero bisogno di implementare questo metodo.

Per ulteriori informazioni see qui.

Problemi correlati