Interfaces en Java

Iniciado por Bob1098, 6 Enero 2016, 23:45 PM

0 Miembros y 1 Visitante están viendo este tema.

Bob1098

Hola, me preguntaba cual es el uso real y práctico de las interfaces en java, es decir, únicamente se utilizan para hacer una "esquemilla" de las clases en java?. No comprendo el sentido que tienen, no es más rápido y cómodo definir los métodos directamente en la clase en lugar de declararlos (no definirlos) previamente en una interfaz?

Espero que alguien pudiera resolverme esta dudilla tonta.

Un saludo.

jsDotx3

Las interfaces en Java se ocupan para definir variables de uso constantes (no cambiarán su valor jamás, por ejemplo, cuando defines el valor de un producto que jamás va a variar). Puedes fácilmente declarar en una de las clases con la propiedad final, pero, por buenas prácticas en POO es que se realiza este método. Básicamente, mantiene un esquema como dices tú.
«La envidia no mata, pero mortifica»

Bob1098

Entiendo, gracias por la ayuda :)

Un saludo.


Bob1098

Cita de: Pablo Videla en  7 Enero 2016, 16:00 PM
Mira los cambios ahora en java 8 para las interfaces.

https://yasnameza.wordpress.com/2015/01/11/una-de-las-novedades-de-java-8/
Interesante aportacion.

Gracias. Un saludo

Enviado desde mi SM-G920F mediante Tapatalk

Chuidiang

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.

4dr14n31t0r

El mejor ejemplo que se me ocurre para ilustrar la gran utilidad que tienen las interfaces en java es la interfaz Comparable.

Esta interfaz solo tiene un metodo que se llama compareTo. Por otro lado, cuando tu haces una lista de objetos (Por ejemplo, List<Integer> lista = new ArrayList<>()) y la llenas, puedes usar un metodo estatico de la clase Collections que se llama sort (Se utiliza asi: Collections.sort(lista); y cuando imprimes los elementos de la lista veras que estan ordenados). Esto lo que hace es ordenar la lista de menor a mayor, pero... ¿Como sabe ese metodo cuando un objeto es mayor que otro? Porque del mismo modo que he dicho List<Integer> lista = new ArrayList<>() (En cuyo caso solo habria que restar los 2 Integers) tambien podria haber dicho List<String> lista = new ArrayList<>()(En cuyo caso te lño ordenaria alfabeticamente) o List<CualquierClase> lista = new ArrayList<>().
Bueno pues lo que hace el metodo sort es utilizar, de la clase que va entre signo de mayor y menor, el metodo compareTo para saber si es mayor o menor que otro. Sin embargo yo podria haber hecho la clase CualquierClase sin sobreescribir el compareTo y sin implementar Comparable. Para eso no hace falta implementar Comparable, ya que podria crear un metodo compareTo directamente, pero tambien podria NO haberlo hecho. Entonces, ¿Como sabe el metodo sort si una clase tiene dentro un metodo que se llama compareTo de forma segura? Por las interfaces.
Lo que realmente hace es comprobar si esa clase implementa Comparable(lo que garantiza que tenga un compareTo), y entonces usa compareTo para saber si uno es mayor o menor que otro.

PD: Para comprobar que una clase implementa Comparable simplemente intenta darle a una variable declarada del tipo de la Interface un objeto de la lista. Si da error no implementa. Un ejemplo:class ClaseQueImplementaInterface implements InterfaceCualquiera{
}
class ClaseQueNoImplementa{
}


public void funcionQueHaceAlgo(InterfaceCualquiera i){
//codigo
}

ClaseQueImplementaInterface obj = new ClaseQueImplementaInterface();
funcionQueHaceAlgo(obj)//Esto no da error de compilación

ClaseQueNoImplementa obj2 = new ClaseQueNoImplementa();
funcionQueHaceAlgo(obj2)//Esto, sin embargo, si da error de compilación

//Tambien se pueden crear objetos de la siguiente forma:
InterfaceCualquiera obj3 = new ClaseQueImplementaInterface();
//Esto provoca que, si la clase tiene metodos que no estan declarados en la interface, no se puedan usar


Cuando estudiando por mi cuenta me topé con las iterfaces, me encontré con que tenía la misma duda que tú, asi que te comprendo perfectamente. Como habrás podido notar hay muchas cosas raras en java que se ven un poco innecesarias (Por ejemplo, para declarar e implementar un constructor éste debe tener el mismo nombrte que la clase, lo que suena un poco redundante porque ya se sabe, al estar dentro de esa clase, que el constructor es de esa clase) pero al final lo agradeceras que sea asi porque el codigo queda mucho mas claro y es mas facil organizarse, aunque parezca una tonteria.