2012-01-25 8 views
8

Las interfaces consisten en métodos abstractos y variables finales. Bueno, se usa como un contrato generalizado para que las clases que lo implementan sigan las reglas implementando métodos en él.Alcance de la utilidad de la interfaz en java

¿Es este el único uso/alcance de la interfaz en Java? ¿Han introducido el concepto de interfaz solo para esto, o me falta algo? Por favor ayúdenme a entender el uso de interfaces, con ejemplos. (No sobre cómo usar o crear interfaces, sino para mostrar cómo están ayudando a los programadores).

Gracias.

+1

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

+0

Bueno, eso es un uso más –

+0

Posiblemente duplicado de http://stackoverflow.com/q/8531292/1055241 echa un vistazo a la respuesta aceptada para comprender el concepto de interfaces. – gprathour

Respuesta

3

El objetivo principal de las interfaces es actuar como una guía para los programadores que necesitan implementar cierto comportamiento en una clase de implementación.

Por ejemplo, si va a implementar una clase Queue que implemente la interfaz List, la interfaz de List requerirá que implemente el método add y un método remove, por ejemplo.

interface List { 

    public void add(Object o); 

    public void remove(Object o); 

} 

Si su Queue implementa la interfaz de lista, debe implementar su propia versión de los métodos de agregar y quitar. La principal ventaja de utilizar una interfaz es que luego puede intercambiar un tipo con otro. Por ejemplo:

// this function returns an ArrayList 
List genericList = (ArrayList) getAnArrayList(); 

O

// this function returns the Queue you implemented 
List myQueue = (MyQueue) getAQueue(); 

Mediante la implementación de la clase como una interfaz, se puede declarar sus variables utilizando un tipo más genérico que si tuviera que utilizar un tipo concreto. Encuentro que esto es realmente útil con un objeto de transferencia de datos o de frijoles, donde una clase de servicio podría usar una lista de arreglos, pero otra podría beneficiarse del uso de un conjunto de claves.En mi bean puedo usar la declaración de la interfaz y dejar que cada clase de servicio determine qué tipo de concreto quiere usar al convertir la variable al tipo concreto.

Las interfaces son básicamente una forma de ayudar a estandarizar las cosas, así como a facilitar el cambio de una clase de implementación por otra.

También me parece que me ayudan a recordar la implementación de ciertos métodos cuando estoy programando algo, ya que puedo describirlos primero en la interfaz y luego el compilador me recuerda que los implemente.

+0

Ok, lo tengo. Cualquier otro uso importante de ella? –

+0

Como los usuarios en otras respuestas mencionadas, las interfaces pueden ayudar con la falta de herencia múltiple. En la mayoría de los casos, generalmente son utilizados por desarrolladores de bibliotecas o proyectos en los que puede existir la necesidad de cambiar un subtipo por otro. El almacenamiento en caché o de datos es un posible ejemplo. El registro es otro. Puede utilizar una interfaz Datastore para abstraer su JDO, Hibernate, Postgres, MySQL, etc. para que pueda intercambiar uno con otro sin necesidad de cambiar cada declaración de variable en su código. – jmort253

+0

Gracias. Tengo mi respuesta. –

3

Es un ejemplo clásico, pero de todos modos. Por ejemplo, desea escribir un juego en el que deben figurar círculos, cuadrados, triángulos y otras formas. No sabe qué forma aparecerá la próxima vez, por lo que debe escribir una interfaz con el nombre Shape con un método abstracto draw y Triangle, Circle, Square clases que implementan la interfaz Shape. Después de eso, no te importa qué forma vendrá después. Puede dar a su método de decir drawNext(Shape s) una instancia de Shape y llamar al método de sorteo para eso. Funcionará para todos los tipos que están implementando Shape.

public void drawNext(Shape s) 
{ 
    s.draw(); //this will call draw() method of Square if you call drawNext(new Square()) and draw() method of Triangle in case drawNext(new Triangle()) and so on.. 
} 

Si no se utiliza esta interfaz tiene que escribir método diferente para todo tipo de objetos drowable (drawSquare(Square s), drawCircle(Circle c) etc ...)

Este es uno de los ámbitos de las interfaces.

3

Java no permite herencias múltiples.

Su decisión de diseño fue implementar interfaces.

Para que pueda definir el comportamiento deseado en una interfaz y que su clase lo implemente.
Esta clase puede ampliar cualquier otra clase (solo 1) e implementar tantas interfaces como sea necesario.

3

Una clase puede implementar muchas interfaces y, por lo tanto, puede proporcionar un "manejo" diferente a la clase en cuestión. Así es como se considera que las clases son polimórficas (pueden tener muchas formas dependiendo de cómo las referencia).

Eche un vistazo a la documentación del tutorial de java con respecto a esto. Algunos ejemplos útiles son;

El último eslabón es grande en términos de enfrentarse con las colecciones en Java y cómo se utilizan las interfaces para proporcionar su funcionalidad.

2

interface 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 interface.

Por lo tanto, si necesita más de 1 lógico que será implementada por una clase [que no es raro], no se puede utilizar sólo abstract clases, usted tiene que utilizar interface s

4

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.

+0

+1 ¡Gran ejemplo! – jmort253

10

Aquí es donde entendí su uso cuando leí por primera vez acerca de ellos:

decir que usted recibe un reproductor de discos portátil como un regalo. Cuando intente operar el reproductor , no ocurre nada --- el reproductor requiere baterías. ¿Qué baterías caben en el reproductor? Afortunadamente, en la parte posterior del jugador es la especificación, This player requires two AA batteries.'' With this information, you can obtain the correctly sized components (the batteries) and fit them into the player. The completed montaje '' opera.

La especificación de las baterías del reproductor de discos servido varios propósitos útiles:

La especificación contó al usuario qué componente debe ser instalado en el jugador para garantizar un funcionamiento correcto. La especificación le dice al fabricante del reproductor de discos de qué tamaño construir la cámara de la batería del reproductor y qué voltaje y amperaje usar dentro de los componentes electrónicos del jugador . La especificación le dijo al fabricante de la batería qué tamaño, voltaje y amperaje para construir las baterías para que otros puedan usarlas . Estos tres hechos son importantes en sí mismos, pero también implican que el usuario, el fabricante del disco y el fabricante de la batería no necesitan comunicarse directamente entre ellos --- la especificación de la batería es todo lo que se necesita para cada parte a realizar su propia tarea independientemente de los otros dos.

+0

¡Realmente un ejemplo impresionante! Gracias –

+2

Este es un gran ejemplo. Podría pensar en las marcas de baterías como implementaciones concretas de la interfaz de tipo de batería. Podría pensar en Energizer, Duracell y Sony como todos implementando la interfaz AA. Las conexiones de la batería son las mismas y la salida es la misma, y ​​por supuesto el tamaño, pero la marca y tal vez algunos componentes internos sutiles son diferentes. +1 – jmort253

2

Un poco de historia ayuda:

El modelo de objetos en Java es más o menos una versión simplificada de la C++ uno. Eso sufría del "problema del diamante" cuando se enfrentaba a una herencia múltiple.

En java, mientras que 1 clase solo puede ampliar 1 clase base, puede implementar múltiples interfaces. Cuando 2 o más métodos en esas interfaces implementadas tienen la misma firma (nombre, número de parámetro y tipos), el programador será consciente de eso Y en el peor de los casos (en caso de que olvide implementar métodos) su comportamiento será no cumplió con devolver nulo o sin hacer nada (eso es lo que los IDE hacen por usted de todos modos). Con herencia múltiple, siempre debe tener cuidado de no anular los métodos de las clases base.

Este enfoque de la idea de interfaces funciona bien con el hecho de que todos los métodos en Java son por defecto virtuales. Esta construcción de interfaz es, así, la forma en que java trata con la herencia múltiple y obtiene algo de presión del programador.

2

Sí, una interfaz consiste en métodos abstractos y variables finales, y se utiliza como un contrato generalizado para que las clases que lo implementan implementen los métodos descritos.

Sin embargo, ese no es el único uso/alcance de una interfaz. Esa es la definición de una interfaz.

Las interfaces se utilizan cuando se sabe con anticipación que cualquier cantidad de clases desconocidas podría hacer el trabajo, siempre que todas presenten un conjunto de comportamiento estandarizado. Por lo tanto, si tengo un objeto de teléfono y deseo permitir que alguien lo escuche, podría escribir un oyente de teléfono que establezca cómo un teléfono puede señalar objetos que aún no se han escrito (y por lo tanto no tienen una clase concreta específica).

A menudo en su programación puede proporcionar una (o más) clases concretas; pero, una interfaz es una señal de que este es un punto de extensibilidad planificada. Para volver a mi ejemplo de clase telefónica, podría escribir en la clase telefónica.

(assume that listeners is a Collection of TelephoneListener) 

public void addListener(TelephoneListener listener) { 
    listeners.add(listener); 
} 

private void simulateCall() { 
    for (TelephoneListener listener : listeners) { 
    listener.onRing(); 
    } 
} 

señalización TelephoneListeners que aún no se han escrito (todavía) que sonó un teléfono.

No es realmente "justo" sobre la simulación de herencia múltiple, aunque los provenientes de un fondo C++ lo identifican como un medio para "resolver" la herencia múltiple. Se trata de especificar un contrato para futuras clases para implementar. La herencia múltiple de C++ confunde el contrato con la implementación (y por lo tanto corre el riesgo del temido patrón de diamante).

5

Le daré un ejemplo.

tiene una clase de coche

class Car{ 
     start(){ 
      //code 
     } 
     stop(){ 
      //code 
     } 
    } 

y desea que un coche estupendo que debe rebotar (pero característica Bounceable pertenece a la bola/goma)

Aquí el Super Car puede aplicar Bounceable

public interface Bounceable{ 

     bounce(); 
    } 

Ahora tiene Super Car car que puede rebotar.

class SuperCar extends Car implements Bounceable{ 
     //My Super Car will bounce. 
    } 
+1

¡Gran ejemplo! +1 para usar un adjetivo para tus interfaces! – jmort253

0

Un ejemplo es amplio:
Especificación del lenguaje Java [interfaz, contrato] de la comunidad de Java
Aplicación por los diferentes fabricantes como Sun/Oracle JDK, IBM JDK, OpenJDK etc

Cuestiones relacionadas