Hola:
Como bien dices, no es cómodo hacer interfaces y hacer que las clases implementen las interfaces. Por eso no hay que hacerlo siempre, sólo cuando sea necesario o preveas que va a ser necesario. ¿Y cuando es necesario? Pues hay muchos ocasiones en que son necesarias, pero básicamente se puede reducir a un único motivo: que vas a llamar a un método que preveas que puede cambiar en algún momento. Me explico.
Imagina que tienes una clase con un método print(texto) que saca el texto por pantalla, algo tan tonto como esto
public class UnaClase {
public void print(String texto) {
System.out.println(texto);
}
}
Todo bien hasta ahora, no es necesario interface ni nada. Pero mientras haces el programa resulta que piensas que quizás más adelante necesites sacar el texto por la impresora, tendrías que cambiar el método por algo asi
public class UnaClase {
public void print(String texto) {
// lo que sea que haya que hacer en java para sacar el texto por impresora.
}
}
pues bien, si en tu programa a veces quieres sacar el texto por impresora, a veces por pantalla, es cuando una interface puede ayudarte. Haz dos clases, una para impresora, otra para pantalla, que implementen ambas una misma interface con el metodo print(texto). Luego, puedes hacer cosas como esta
public void unMetodo(LaInterface laInterface) {
// aqui el codigo que calcule el texto que quieras sacar por pantalla/imprimir
laInteface.print(texto);
}
¿qué hace ese código? ¿saca por pantalla o imprime en la impresora?. Pues depende de la clase concreta que le pases al llamar al metodo
a.unMetodo(new ClaseQueImprime());
a.unMetodo(new ClaseQueSacaPorPantalla());
y si mas adelante quieres guardar ese texto en base de datos, te bastaría una tercera clase que implemente la interface y solo tienes que pasarsela al metodo. has conseguido un método (trozo de código) que puede sacar por pantalla, imprimir o meter en base de datos sin necesidad de retocarlo.
Resumiendo, una interface tiene sentido cuando preveas al menos dos clases distintas que la van a implementar y que vas a querer poder intercambiar una por otra de forma transparente, sin tocar codigo.
En java encontrarás muchos ejemplo. Por ejemplo, ¿qué hace un JButton de java cuando lo pulsas?. Nada, solo llamar al método actionPerformed() de la interface ActionListener que se le pase en el metodo addActionListener()
unJButton.addActionListener(unaClaseQueImplementaActionListener);
los de java han conseguido hacer un JButton que hace lo que el programador quiera que haga sin necesidad de recompilar el Jbutton cada vez y sin saber siquiera cómo se llama la clase java que el programador va a realizar.
Se bueno.