Aplicando overwriting en componentes swing

Si hablamos de programación orientada a objetos, pues tambien tenemos que hablar de polimorfismo. El polimorfismo se podría dividir concretamente en dos sustantivos: sobreescritura (overwriting) y sobrecarga (overriding) de métodos, los cuales forman parte importante en la implementación del api del j2se.

Estos dos conceptos no son muy dificiles de entender, sin embargo, el ver la puesta en escena de estos conceptos se da casi siempre en nuestras propias clases, lo cual es sencillo ya que para nosotros nuestra clase es una caja blanca la cual podemos ver claramente. Lo que voy a mostrar ahora, es como aplicar la sobreescritura de métodos en la API del J2SE y para hacerlo aun mas grafico, lo aplicaré sobre la clase JFrame, la cual es una ventana de las normales que todos podemos ver.

A continuación pondré el código del programa:

import javax.swing.*;
import java.awt.*;

public class PruebaFrame
{
  public static void main(String args[])
   {
     JFrame f = new JFrame()
   {

    public String getTitle()
    {
      return "Mi ventana";
    }

    public boolean isResizable()
    {
      return false;
    }

    public Rectangle bounds()
    {
      return new Rectangle(50, 50, 300, 300);
    }

    /*public Dimension getSize()
    {
      return new Dimension(500, 500);
    }*/

    public void setVisible(boolean b)
    {
      show(true);
    }
  };
  f.setVisible(false);
  }
}

Si se dan cuenta, todos los métodos que implemento dentro del objeto f, son métodos que ya pertenecen a la clase JFrame, por consiguiente, lo que estoy haciendo arriba es simplemente sobreescribirlos. Ahora, normalmente nuestros métodos get…() siempre devuelven un atributo de la clase, pero en esta clase no siempre sucede eso. Si se dan cuenta el metodo getSize() esta como comentario. Si nos ponemos a pensar para mostrar una ventana tenemos que llamar a setSize(ancho, alto), por lo que asumiríamos que la implementación de este método seria la siguiente:

public void setSize(int w, int h)
{
   witdth = w;
   height = h;
}

Sin embargo, esto no sucede en la implementación de este método. Si no me creen, para ver como estaba implementado tuve que ver la implementación de las clases de java y ahí encontré esto:

public void setSize(int width, int height) {
     resize(width, height);
   }

@Deprecated
public void resize(int width, int height) {
    synchronized(getTreeLock()) {
       setBoundsOp(ComponentPeer.SET_SIZE);
       setBounds(x, y, width, height);
    }
}

Como ven setSize() llama a resize(), el cual es un método deprecado pero del cual aun es usada su funcionalidad, por lo cual en el programa que esta primero, no sobreescribo a getSize() sino que voy a trabajar con getBounds(), el cual al mismo llama a bounds(), por lo que sobreescribiré a este ultimo.

Si ven arriba, el getTitle() si fue sobresscrito, pero el sobreescribir un método getter no modifica el atributo principal de la clase, por lo que asumiremos que el getTitle() es llamado para modificar al atributo “title” en otra clase del paquete java.awt, lo cual es muy probable ya que en la clase Frame, el atributo title no tiene modificador de acceso, lo cual lo hace accesible y modificable en cualquier clase del mismo paquete.

Bueno, eso es todo lo que me pude dar cuenta al ver una pequeñísima parte del código fuente del api del j2se. El código fuente esta libre en la pagina de Sun, por lo que si quieren se pueden dar una vuelta por ahí y bajarlo, ya que esta muy interesante.

Hasta el próximo post!.