2014-04-18 20 views
5

Per quanto ne so non è possibile dichiarare metodi statici nel corpo dell'interfaccia. Tuttavia, ho trovato per caso un pezzo di codice particolare sul sito http://docs.oracle.com/. Ecco il linkMetodi statici nell'interfaccia java

Namelly

public interface TimeClient 
{ 
void setTime(int hour, int minute, int second); 
void setDate(int day, int month, int year); 
void setDateAndTime(int day, int month, int year, 
          int hour, int minute, int second); 
LocalDateTime getLocalDateTime(); 

static 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 ZonedDateTime getZonedDateTime(String zoneString) { 
    return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); 
    } 
} 

questo interface ha un metodo staticgetZoneId

sono perduto ... qualcuno potrebbe spiegare per favore

+4

se _potete_ dichiarare metodi statici in interfacce a partire da Java 8. Nota anche il 'getZoneDateTime() 'metodo (metodo di estensione virtuale, anche nuovo in Java 8). – fge

+1

Si prega di leggere questo http://marioosh.5dots.pl/2014/02/12/java-8-default-and-static-methods-in-interfaces.html – Sap

+0

Non hai visto il nuovo elenco di funzionalità di Java 8? controllalo. –

risposta

5

Java 8 ha ora l'idea di "default "Implementazioni del metodo nelle interfacce:

http://blog.hartveld.com/2013/03/jdk-8-13-interface-default-method.html

+1

beh, tutti hanno risposto correttamente alla mia domanda. Sei stato il primo però. –

+1

Non proprio, c'è una differenza tra i metodi predefiniti e quelli statici, quindi non confondiamoli (e altri utenti). Questo era forse un buon puntatore, ma non una risposta corretta. – virgo47

+0

@ virgo47 hai ragione, non sono sicuro di quello che sto facendo qui. Ho cercato di vedere se la domanda aveva originariamente referenziato i metodi predefiniti, ma non è così. Lo cancellerò. Ehm, non posso cancellarlo perché è accettato :( –

5

A partire da Java 8 è possibile farlo. Il official tutorial che il frammento è venuto da (che è stato aggiornato per Java 8) dice che la cosa migliore:

Il corpo interfaccia può contenere metodi astratti, metodi predefiniti e metodi statici. Un metodo astratto all'interno di un'interfaccia è seguito da un punto e virgola, ma senza parentesi (un metodo astratto non contiene un'implementazione). I metodi predefiniti sono definiti con il modificatore default e i metodi statici con la parola chiave static. Tutti i metodi astratti, predefiniti e statici in un'interfaccia sono implicitamente pubblici, quindi puoi omettere il modificatore pubblico.

O da JLS section 9.4 di Java 8:

Un metodo predefinito è un metodo che è dichiarato in un'interfaccia con il modificatore default; il suo corpo è sempre rappresentato da un blocco. Fornisce un'implementazione predefinita per qualsiasi classe che implementa l'interfaccia senza sovrascrivere il metodo. I metodi predefiniti sono distinti dai metodi concreti, che sono dichiarati nelle classi.

...

Un'interfaccia può dichiarare metodi statici, che vengono richiamati senza riferimento ad un particolare oggetto.

4

in Java 8, le interfacce possono avere metodi statici, oltre a metodi sovrascrivibili con un'implementazione predefinita. Non possono ancora avere campi di istanze. Queste funzionalità fanno parte del supporto per espressioni lambda e puoi leggerne di più nella Parte H di. JSR 335

13

Voi siete la testimonianza di due nuove funzionalità di Java 8 qui:

  • metodi statici in interfacce,
  • metodi di estensione virtuale.

Nel codice di esempio che fornisci, getZoneId() illustra la prima novità, e .getZoneDateTime() il secondo.

Il secondo, in particolare, è quello che ha permesso l'interfaccia Collection da estendere con metodi supplementari quali .stream(), per esempio, senza rottura compatibilità all'indietro. Vedi here per un'illustrazione.

Il primo consente di evitare la scrittura di classi "method bags" che spesso esistono solo per fornire metodi statici di utilità su interfacce. Un esempio potrebbe essere Guava's Functions class (da non confondere con Java 8 di Function cui praticamente rubato Guava, insieme a Predicate e pochi altri)