Programmazione contro interfacce in Java

1

Supponendo di avere un'interfaccia Foo e una determinata implementazione FooImpl.

public class FooImpl implements Foo

Se voglio definire una nuova operazione su questa classe che dipende dalla particolare implementazione, è corretto definirla nella classe di implementazione o come metodo statico su una classe Util come FooUtils.operation?

public class FooImpl {
  public void operation() {
    ...
  }
}

public class FooUtils {
  public static void operation(Foo f) {
    ...
  }
}

La prima opzione mi obbliga a trasmettere alla classe di implementazione data ogni volta che voglio usarla su un oggetto che è dichiarato del tipo di interfaccia (è buona prassi programmare su interfacce). Ad esempio:

Foo f = FooImpl.newInstance();
((FooImpl) f).operation();

che è un po 'brutto.

La seconda opzione non ha questo problema, ma non è neanche carina:

FooUtils.operation(f)
    
posta dabd 12.11.2014 - 15:03
fonte

2 risposte

9

Se non tutti gli implementatori di Foo devono contenere operation() , allora operation() non può essere dichiarato in Foo , semplice e semplice.

La programmazione contro le interfacce anziché le lezioni concrete è una buona idea, ma solo se l'interfaccia è effettivamente sufficiente per le tue esigenze. Se devi chiamare operation() , devi dichiarare FooImpl , o forse una sottointerfaccia personalizzata di Foo , ma mai Foo . Ciò potrebbe sovvertire completamente il punto di utilizzo di un'interfaccia: non dover conoscere sottoclassi concrete.

    
risposta data 12.11.2014 - 15:07
fonte
0
  • Innanzitutto, se ti ritrovi a eseguire il casting prima di chiamare un'operazione, potrebbe essere un segno che c'è qualcosa di sbagliato nella tua struttura di ereditarietà. Se la tua ereditarietà è buona, tutti i metodi possono essere richiamati da altre classi sono esposti nell'interfaccia e non dovrai fare casting

  • Non tutto deve essere astratto nell'interfaccia. Generalmente utilizzerai l'interfaccia per testabilità (per introdurre facilmente oggetti falsi) o se hai diverse implementazioni. Non userò l'interfaccia per le entità di dominio.

  • Sia che si inserisca un'operazione nella classe o in un'altra classe, è necessario vedere la natura dell'operazione. L'operazione utilizza la maggior parte dei campi di questa classe? Se è così probabilmente appartiene a questa classe. Per quanto mi riguarda, in genere cercherò di evitare il metodo statico, a meno che non si tratti di qualcosa di non correlato alla logica del dominio

risposta data 12.11.2014 - 15:16
fonte

Leggi altre domande sui tag