style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Adaptadores

Que tal, me gustaria que me ayudaran con esta duda que me surgio sobre cuando es conveniente usar adaptadores y cuando no.

Agradezco su ayuda.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Jvan

Adaptadores?

Adaptadores?

Imagen de ezamudio

patrón adaptador

Si te refieres a las clases que implementan una interfaz con todos los métodos vacíos, pues los puedes usar cuando sólo te interesa implementar uno de los métodos de la interfaz.

El patrón adaptador es como sigue: Tienes una interfaz con varios métodos, por ejemplo java.awt.event.FocusListener que bueno, sólo tienes dos métodos pero en fin, tal vez quieres recibir una notificación cuando un componente pierde foco pero no te interesa hacer nada cuando obtiene el foco. Entonces, en vez de implementar directamente la interfaz, puedes extender la clase java.awt.event.FocusAdapter, que es una clase abstracta que ya implementa ambos métodos, pero no hace nada, son implementaciones vacías. Y solamente reimplementas focusLost().

Pero si estás haciendo un componente que necesita enterarse de ambas notificaciones (cuando el foco se obtiene y cuando se pierde) pues no tiene caso extender el FocusAdapter, mejor implementas directamente FocusListener.

Imagen de bferro

WindowAdapter, focusAdapter, etc. NO son adaptadores

Si el catálogo de patrones de diseño de GOF se hubiera tenido en cuenta para dar nombre a alguna de las clases de Java, entonces es probable que las clases como WindowAdapter, FocusAdapter y otras hubieran sido bautizadas de otra manera, pues en realidad, ellas NO adaptan nada en el sentido del patrón de diseño Adapter.
Y es cierto, WindowAdapter por ejemplo no necesita adaptar la interfaz que necesito con la interfaz que me ofrece. Es simplemente, como expresa @ezamudio, una facilidad para que yo no tenga que escribir métodos vacíos para todos los métodos que deben implementarse si deseo escribir un WindowListener, que solamente hace uso de unos cuantos de esa decena de métodos.
El patrón Adaptador resuelve otro problema, que es poder lograr que clase con interfaces diferentes pueden colaborar entre sí, mediante un adaptador que convierta la interfaz que un componente brinda en la interfaz que el cliente necesita.
Como sucede con casi todos los patrones, el patrón Adapter está relacionado con otros patrones, y su estructura es muy similar a varios de ellos, aunque persigan objetivos diferentes.
Un ejemplo de un adaptador de la vida real es el que normalmente cargamos cuando viajamos a Europa: un adaptador de espiga plana a espiga redonda.

Gracias!

Que tal! Le agradezco mucho su ayuda y la explicacion @ezamudio y @bferro. Muy clara la explicacion y con lo que vi recientemente en el salon de clases me quedo mucho mas claro.

Confusión

Buenas Noches, soy un nuevo miembro en el blog y mi pregunta es la siguiente:

Con respecto a lo que están diciendo la verdad es que agradecería que me puedan aclarar ciertos puntos que me están causando gran confusión:

Para empezar: Según lo aprendido, tengo entendido que una clase abstracta es una clase con métodos HUECOS, VACIOS que espera ser implementada en alguna otra clase para poder, de esta manera, sobre-escribir sus métodos y así hacer uso de ellos.
Ahora por otro lado, una característica que posee una clase abstracta es que NO SE PUEDE INSTANCIAR, osea no se puede hacer un NEW de aquello.

Ahora entiendo que la INTERFAZ FOCUSLISTENER es ABSTRACTO por ende si hago IMPLEMENTS me veo obligado a crear en la clase que lo implementa sus dos métodos FOCUSGAINED y FOCUSLOST y sobre-escribirlos.

No sé si estaré en lo correcto ahora otro punto es que:

arriba mencionan que el FOCUSADAPTER es una clase ABSTRACTA, entonces la pregunta es porque yo puedo hacer esto:

try{
MaskFormatter maskDNI = new MaskFormatter("########");
txtDniAlu = new JFormattedTextField(maskDNI);
txtDniAlu.setBounds(527, 272, 86, 20);
txtDniAlu.setColumns(10);
txtDniAlu.addFocusListener(new FocusAdapter(){
public void focusGained(FocusEvent e){
e.getComponent().setBackground(Color.YELLOW);
}
});
pnlAlu.add(txtDniAlu);
}catch(ParseException pe){
pe.printStackTrace();
}

Ahi estoy INSTANCIANDO un objeto de tipo FOCUSADAPTER o estoy en un error, entonces si nos basamos en la TEORIA de POO, eso sería imposible porque como decía líneas arriba no se puede crear objetos de una clase abstracta.

Agradecería me pudieran ayudar a resolver esta duda.

Gracias.

Imagen de ezamudio

clase anónima

Estás creando una clase anónima que extiende FocusAdapter. Es una sintaxis horrible pero así es como te ahorras definir una clase que extiende otra (o implementa una interfaz) sólo para redefinir o implementar un método y usarla en un lugar.

Clase Anónima = ¿INNER CLASS?

Antetodo quiero agradecerte ezamudio por darte el tiempo de contestarme, así mismo hacerte la consulta sobre si una CLASE ANONIMA es lo mismo que un INNER CLASS o son temas diferentes, verás, yo estoy en 2do ciclo de informática y el tema de INNER CLASS lo llevo en 3ro, ahora el motivo de la pregunta es que entre a internet con la información que me diste sobre las clases anónimas para leer algo al respecto, y había muchos post hablando de clases anónimas e inner classes, sé por referencia de mis colegas que están un ciclo más que yo que en 3ro tocan el tema de inner class. Ahora, la pregunta es una clase anónima es lo mismo que una inner class?

Agradezco de antemano la respuesta.

Saludos

Imagen de ezamudio

es un tipo

Una clase anónima es un tipo de clase interna, sí. Es decir, todas las clases anónimas son clases internas, pero no todas las clases internas son anónimas.

Esto:

public class Externa {

public void caca() {
  alguien.setActionListener(new ActionListener() {
    public void actionPerformed() {
      //bla
    }
  });
}

No es más que azúcar sintáctica para esto:

public class Externa {
  private class MiActionListenerQuesolamenteUso1vez implements ActionListener {
    public void actionPerformed() {
      //blabla
    }
  }

  public void caca() {
    alguien.setActionListener(new MiActionListenerQuesolamenteUso1vez());
  }
}

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">