2012-03-21 16 views
7

Sto provando a scrivere la mia prima libreria, ma sto ancora riscontrando alcuni problemi di progettazione.Librerie di scrittura Java

La mia libreria si aspetta molta configurazione per cui ho creato interfacce e classi predefinite Impl, ma ora la mia libreria richiede molta interazione con la chiamata esterna. Questo avviene anche tramite interfacce, ma ho la sensazione che l'utente sia costretto a scavalcare troppi metodi che restituiscono solo qualche errore di default o anche null. C'è un modo più bello per rendere tutte le parti "puoi ma non devi implementare" più facoltative?

risposta

10

Anche se si crea un'interfaccia, spesso ha anche senso creare una classe di base astratta che gli utenti della libreria possono estendere per implementare l'interfaccia.

La classe base astratta può fornire implementazioni predefinite dei metodi in modo che l'utente della libreria non abbia bisogno di crearli da sé. Può anche definire metodi astratti che l'utente API deve implementare se vogliono creare una sottoclasse concreta.

public abstract class MyBaseClass implements MyInterface { 
    // abstract method 
    // anyone who extends must implement this  
    public abstract void myMethod1(); 

    // default error implementation 
    // overriding is optional, but if used it will throw an error 
    public void myMethod2() { 
     throw new UnsupportedOperationException(); 
    } 

    // default implementation that subclasses may find useful: 
    public void doBothMethods() { 
     myMethod1(); 
     myMethod2(); 
    } 
} 
+3

Per alcuni buoni esempi, consultare ['java.util.AbstractCollection'] (http://docs.oracle.com/javase/6/docs/api/java/util/AbstractCollection.html) e il suo sottoclassi. – Taymon

2

Questa è certamente un'area in cui non è stato un approccio ideale. È stato riconosciuto come tale ed è stato indirizzato usando public defender methods. Il link ti porterà a una proposta di miglioramento della lingua (ufficiale).

Pertanto, si consiglia di attenersi alle interfacce e fornire le implementazioni predefinite di ogni metodo utilizzando i metodi di libreria statica. In questo modo, sei preparato quando il buon metodo del difensore diventa disponibile.