2014-04-02 15 views
6

Con i metodi predefiniti ora aggiunti a Java 8, esiste un modo per creare un costruttore predefinito?c'è un modo per aggiungere un costruttore predefinito a un'interfaccia

ho provato:

public interface KadContent<T> 
{ 
    public default KadContent() 
    { 

    } 
... 

ottenere l'errore <identifier> expected da Netbeans

Perché necessario? Sto usando Gson per serializzare gli oggetti e ottenere l'errore "impossibile richiamare il costruttore no-args .." e so che posso risolvere questo problema usando Gson's InstanceCreator. Ma c'è un modo per creare un Costruttore predefinito?

Aggiornamento

ho trovato il problema con il mio codice. Stavo usando

gson.fromJson(new String(data), InterfaceName.class); 

invece di

gson.fromJson(new String(data), ClassName.class); 

Così, anche se la sottoclasse aveva costruttori predefiniti, il codice di deserializzazione era errato. Ma la questione del costruttore predefinito rimane valida.

+6

Le interfacce non devono avere Constructor. Non fanno parte della creazione dell'oggetto. Dovrebbero mantenere il contratto tra due parti. –

+2

Cosa significherebbe un costruttore predefinito? Cosa creerebbe un'istanza di? –

+0

Beh Gson lo richiede, questo è tutto il bisogno che ho per questo. –

risposta

7

No, questo non è possibile.

  1. Non ha senso in un'interfaccia
  2. Se si implementa un'interfaccia, la classe ha già un costruttore di default (quello senza argomenti)

si consiglia di utilizzare una classe astratta se vuoi che le implementazioni abbiano un "costruttore predefinito".

+0

Se java avesse dei veri Enum, sarei d'accordo con "1.". Ma non puoi estendere Enums, e se vuoi aggiungere alcune funzionalità alle tue enumerazioni allora rimani bloccato con le interfacce. E sì: allora un costruttore predefinito avrebbe senso. Lo stesso tipo di "non ha senso" si ottiene quando si desidera ereditare metodi statici, il che in alcuni casi ha molto senso. – flaschenpost

+0

Il punto è che per definizione un'interfaccia non fornisce alcuna funzionalità. Naturalmente, questo è un po 'cambiato dai metodi predefiniti. Ma con i metodi predefiniti non è possibile modificare direttamente lo stato di un oggetto. L'implementazione definisce quali stati sono possibili (definendo le variabili membro), non l'interfaccia. L'interfaccia specifica solo cosa arriva e cosa esce, mentre i dettagli dell'implementazione sono delegati all'implementazione. Pertanto, non ha senso fornire un costruttore predefinito, perché non è possibile impostare o modificare alcuna variabile al suo interno. – thobens

2

Non ha senso fornire un Constructor in un Interface.

Verificare se è opportuno fornire un metodo predefinito initialize().

+0

Il metodo predefinito 'initialize() 'sarà chiamato automaticamente quando questa classe di interfaccia viene messa nell'heap? –

+1

No, dipende da te chiamare initialize(), ad esempio in una fabbrica – AlexWien

1

È necessario aggiungere il costruttore predefinito alla classe che si desidera serializzare.

+0

Ho fatto ciò ma ottenendo ancora l'errore, suppongo di dover spostare il codice di serializzazione nella classe piuttosto che l'interfaccia –

+0

dipende, se è una custom serializzazione, quindi l'interfaccia potrebbe definire methos come writeObjectData (DataOutputStream dos) e readObjectData() – AlexWien

+0

Ti sei ricordato di rendere pubblico il costruttore noArg nella tua classe? – MTilsted

1

Costruttori sono quando gli oggetti entrano in foto e il fatto che un oggetto per un'interfaccia non può essere costruita è il suono, sia esso Java, C# o Java8

Quindi ... se una funzionalità che si farebbe vuoi definire di default a livello di interfaccia, Java8 introduce il concetto di Default Methods.

Problemi correlati