Java: quali metodi inserire nell'interfaccia e cosa tenere fuori

4

Sto progettando un'interfaccia di gestione file:

public interface FileHandler
{
    public void openFileHandler(String fileName);
    public void closeFileHandler();

    public String readLine();
    public String [] parseLine(String line);
    public String [] checkLine(String line[]);

    public void incrementLineCount();
    public void incrementLineSuccessCount();
    public void incrementLineErrorCount();

    public int getLineCount();
    public int getLineSuccessCount();
    public int getLineErrorCount();     
}

Mi è presto chiaro che questi metodi non possono essere resi privati . Non voglio incrementLineCount essere pubblico.

Qual è il modo corretto di progettare un'interfaccia come questa?

    
posta lewicki 27.09.2012 - 20:05
fonte

2 risposte

14

Un'interfaccia specifica comportamento , non specifici dettagli di implementazione.

È necessario specificare le operazioni che si desidera qualsiasi cosa che implementa la propria interfaccia per supportare. Un modo per determinare ciò è chiedere "In che modo i consumatori useranno la mia interfaccia, qual è il contratto che sto specificando?"

Lascia i dettagli (ad esempio i metodi privati) alle implementazioni. Questo è il punto delle interfacce: puoi avere diverse implementazioni che si comportano in modi diversi, ad es. la differenza tra leggere un file da un disco e leggere un file dal cloud ....

    
risposta data 27.09.2012 - 20:07
fonte
2

Le interfacce dovrebbero essere progettate tenendo conto di ciò che gli oggetti esterni dovranno chiamare su classi che implementano l'interfaccia specifica.

Questo è esattamente ciò che la classe dovrebbe essere in grado di fare dall'esterno. Per tutto il resto è possibile utilizzare classi astratte con metodi protetti (quindi si avrà la stessa comodità per forzare l'implementazione in sottoclassi ma senza essere obbligati a renderle pubbliche).

Qualcosa come:

interface FileHandler {
  public void openFileHandler(String fileName);
  public void closeFileHandler();
}

abstract class AbstractFileHandler implements FileHandler {
  ...
  protected abstract void incrementLineCount();
  protected abstract void incrementLineSuccessCount();
  protected abstract void incrementLineErrorCount();
}

class ConcreteFileHandler extends AbstractFileHandler {
  ...
}

Se non hai bisogno di avere un antenato comune, basta dichiarare i metodi privati nella tua classe concreta e il gioco è fatto.

    
risposta data 27.09.2012 - 20:08
fonte

Leggi altre domande sui tag