Como usted ha dicho, las interfaces se utilizan para especificar los contratos que deben seguir las clases que los implementan. Los escenarios en los que se usan suelen ser un escenario donde se llama a una clase que implementa una interfaz particular. El hecho de que implemente una interfaz particular le proporciona el conocimiento de que esa clase dada, de hecho implementa un conjunto dado de métodos. Usualmente no le importa lo que sucede en estos métodos, lo que le importa es que la clase tenga estos métodos.
Como ejemplo, es posible que desee considerar el Observer Design Pattern. Básicamente, tiene un objeto que tiene un estado que comparte con otros objetos y le transmite notificaciones cuando cambia alguno de sus datos.
lo tanto, si por ejemplo todos los observadores implementar la siguiente interfaz:
public interface Observer
{
notify();
}
el sujeto puede, sin ningún conocimiento de lo que nunca se registran para la observadores, hacer algo como esto:
public class MySubject...
{
List<Observer> observers;
.....
public void notifyAll()
{
for (Observer observer : observers)
{
observer.notify();
}
}
}
Como puede ver, la clase MySubject
no tiene ningún conocimiento de cómo el Observer implementa el método notify
, lo que realmente le preocupa es que lo implemente.Esto le permite crear diferentes observadores que tienen diferentes formas de implementar su propia clase notify
sin requerir ningún cambio en la clase MySubject
.
Las interfaces también permiten cierto tipo de seguridad. Las interfaces generalmente también son útiles cuando tiene una serie de clases que implementan una serie de comportamientos similares que generalmente desea almacenar en una estructura de datos segura. Esto suele ser un buen trabajo en torno al hecho de que Java no permite herencia múltiple. Entonces, en el ejemplo proporcionado anteriormente, puedo tener una cantidad indefinida de diferentes clases. Pero siempre y cuando todos implementen la interfaz Observer
, todos pueden agregarse a la misma lista.
En los métodos notifyAll
, entonces puedo simplemente iterar de los elementos de la lista en lugar de verificar si el elemento es de un cierto tipo y luego lanzarlo, lo que puede introducir algo de sobrecarga en la ejecución del programa.
No sé si es exactamente una respuesta, entonces comentaré. 'interfaces's son cruciales en Java porque no tiene herencias múltiples. Si quiere que su clase sea 'Iterable', pero también quiere implementar cierta lógica, no puede heredar de 2 clases, por lo tanto, tendrá que usar la interfaz. Entonces, si necesitas más de 1 lógica para ser implementada por una clase [que no es poco común], no puedes usar solo clases 'abstractas', tendrás que usar una' interfaz'. – amit
Bueno, eso es un uso más –
Posiblemente duplicado de http://stackoverflow.com/q/8531292/1055241 echa un vistazo a la respuesta aceptada para comprender el concepto de interfaces. – gprathour