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)