Foros del Web » Programación para mayores de 30 ;) » Java »

variables de interface

Estas en el tema de variables de interface en el foro de Java en Foros del Web. Buen dia compañeros del foro. Estoy intentando desglosar algo de la api de java ee7 y tengo que aceptar que me esta dando muy duro ...
  #1 (permalink)  
Antiguo 06/12/2018, 18:44
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 138
Antigüedad: 5 años, 6 meses
Puntos: 2
variables de interface

Buen dia compañeros del foro.
Estoy intentando desglosar algo de la api de java ee7 y tengo que aceptar que me esta dando muy duro entenderla.
En el paquete javax.websocket entre unas tantas, hay dos interfaces:
1)session
2)remoteEndpoint

y en la parte de abajo estan las clases, y entre ellas hay una que se llama EndPoint.
cuando le doy click en esa clase, como es esperado se muestra la documentacion para dicha clase, y bajando un poco por esta pantalla aparece el siguiente ejemplo que no he podido entender.
por Ejemplo.
Código Java:
Ver original
  1. public class EchoServer extends Endpoint {
  2.  
  3.      public void onOpen(Session session, EndpointConfig config) {
  4.          final RemoteEndpoint remote = session.getBasicRemote();
  5.          session.addMessageHandler(new MessageHandler.Whole<String>() {
  6.              public void onMessage(String text) {
  7.                  try {
  8.                      remote.sendString("Got your message (" + text + "). Thanks !");
  9.                  } catch (IOException ioe) {
  10.                      // handle send failure here
  11.                  }
  12.              }
  13.          });
  14.      }
  15.  
  16.  }
lo que no entiendo es lo siguiente:
¿si no se puede declarar variables de una interface entonces entonces por que se declarò como sigue:?
Código Java:
Ver original
  1. RemoteEndpoint remote=session.getBasicRemote();
si dentro de la clase creada "EchoServer extends Endpoint"veo que RemoteEndpoint es una interface que llama a la interface session que es otra interface que invoca un metodo que devuelve un tipo de dato RemoteEndpoint.

en la documentacion se ve en la tabla como sigue
Modifier and Type
RemoteEndpoint.Basic
Method and Description
getBasicRemote()
Return a reference a RemoteEndpoint object representing the peer of this conversation that is able to send messages synchronously to the peer

Y en todo lo que llevo investigando, en todo lado dice que no se pueden crear variebles ni instancias de interfaces.
Muchas gracias a aquel que dè respuestas a mi pregunta, de verdad que esa transferencia de conocimento hacia otros que quieren aprender se traduce a algo solido y exitoso.

Última edición por dacroma; 06/12/2018 a las 18:49
  #2 (permalink)  
Antiguo 06/12/2018, 22:32
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 706
Antigüedad: 10 años, 6 meses
Puntos: 56
Respuesta: variables de interface

No tengo claro tu duda, pero creo qiue tiene que ver con que al parecer crees que no se pueden instanciar las interfaces y te resulta por lo tanto raro ver que haya funciones que devuelvan un objeto de un tipo que sea una interface.

Sera esa la duda?

Si es esa la duda, entonces tengo una respuesta que podria servirte.

La interface efectivamente no puede instanciarse, esa creencia es correcta.
Las clases declaran implementar una interface, y las clases si pueden instanciarse;
Los objetos de esa clase, porque la clase declaro que implementaba la interfaz, tienen disponibles los metodos que la interface indico'. Pueden tener mas, pero seguro que tienen los que la interface indico'.

Entonces si tienes una interfaz I y una clase C que implementa I, y creas un objeto

C objetoC = new C();

entonces tambien es completamente posible escribir esto, en vez de lo anterior:

I objetoI = new C();

con ello, hay 2 cosas, una dicha al lado izquerdo y otra al lado derecho.
Al lado derecho es la creacion del objeto mismo, no hay duda es de tipo C. Pero C implementa I, vamos al lado izquierdo, "objetoI" ahora se trata de la interfaz nada mas, entonces "objetoI", para este caso, solo sera capaz de ver lo que la interfaz I provea, al usar la referencia "objetoI".

La creacion de los objetos esta al lado derecho, al lado izquierdo son referencias nada mas.

No hay nada malo en considerar los objetos con una mirada restringida como la de las interface y creo que esto es lo que esta detras de la duda que planteas.

Si no es asi, no acerte' :(
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 07/12/2018, 05:58
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 138
Antigüedad: 5 años, 6 meses
Puntos: 2
Respuesta: variables de interface

Buen dìa, CalgaryCorpus dejame decirte que esa es en gran parte la duda. Pero si te pones a mirar en el codigo que escribì en la primera parte, una interface esta instanciando a otra interface
Código Java:
Ver original
  1. RemoteEndpoint remote=session.getBasicRemote();
¿Como se relacionan y como se llama este comportamiento?.
  #4 (permalink)  
Antiguo 07/12/2018, 09:20
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 706
Antigüedad: 10 años, 6 meses
Puntos: 56
Respuesta: variables de interface

En el codigo que mandas no veo que estes creando explicitamente el objeto session, asi que asumo que Session es una interface. Nuevamente te indico que una interface, en este caso, solo es un "filtro" hacia un objeto existente, que te indica que' metodos puedes invocar hacia el. No es que sea "una interfaz invocando metodos", es efectivamente un objeto, de no se que clase, pero que mirado con el filtro Session, sabemos que tiene un metodo que podemos invocar de el.

Un ejemplo para explicarlo de otra manera:

Código Java:
Ver original
  1. Interface Animal {
  2.   void respirar();
  3. }
  4.  
  5. class Perrro implements Animal {
  6.     void respirar() { // hacer que el perro respire
  7.     }
  8. }
  9.  
  10. class Gato implements Animal {
  11.     void respirar() { // hacer que el gato respire
  12.     }
  13. }

y luego tener un metodo que reciba un Animal

Código Java:
Ver original
  1. void miGranMetodo( Animal animal ) {
  2.    // y en medio de el...
  3.    animal.respirar();
  4. }
y este metodo se puede invocar con un gato o un perro, que son clases completamente distintas, sin ninguna relacion entre ellas, pero al metodo no le importa esto, solo le importa que el objeto que uses sea de una clase que haya implementado el metodo resprar, y es este el metodo que va a usar.

Código Java:
Ver original
  1. Perro perro = new Perro();
  2.   Gato gato = new Gato();
  3.  
  4.   miGranMetodo(perro);
  5.   miGranMetodo(gato);

Cuando en medio de miGranMetodo estas usando animal.respirar() estas usando la interface, pero realmente lo que el compilador hace por ti es ir al metodo que la clase implemento, para el objeto que pasaste como parametro.
__________________
Visita mi perfil en LinkedIn
  #5 (permalink)  
Antiguo 07/12/2018, 18:15
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 138
Antigüedad: 5 años, 6 meses
Puntos: 2
Respuesta: variables de interface

CalgaryCorpus
Gracias, despues de tu respuesta he estado dandole y dandole. Admito que es un poco dificil, realmente me esta sacando canas, pero tu respuesta es acertada.
Muchas gracias.



La zona horaria es GMT -6. Ahora son las 14:15.