¿Que es POO?

Las siglas que corresponden a la programación oriendata a objetos son POO, que muchas veces los autores prefiern utilizar las sigla OOP por su traducción en ingles ( Objet Oriented Programing ).

En este articulo tratare de explicar de forma sencilla los conceptos y terminos que se manejan en este tipo de programación. La Programación Orientada a objetos nos da una visión mas natural de nuestros programas. POO cuenta con una visión conformada por objetos.

Cuando nos referimos a una visión natural lo que trato de transmitirte es que este tipo de programación pretende tener una mayor contacto con el mundo real de tal manera que para que nosotros podamos resolver un problema tenemos que identificar cada uno de los elementos de este con objetos del mundo real.

Despues de esta pequeña explicación sobre la POO vermos que hemos mencionado un elemento muy importante de ella el objeto.

Un objeto es una representación de un objeto real perteneciente a nuestro mundo, por ejemplo podemos tener un objeto coche que represente un coche dentro de nuestro mundo , un objeto perro, un objeto factura ,cliente etc..

Un objeto tiene dos caracteristicas principales estas son estado y comportamiento, el estado nos va ayudar a diferenciar cada uno de los objetos en nuestro mundo, esto lo realizara por medio de una serie de parametros por ejemplo para el objeto coche su estado puede ser rojo,parado,deportivo, etc.. para un objeto factura su estado puede ser cancelado, pagado mientras que el comportamiento de estos mismo objetos podrian ser para el caso del coche girar,acelerar,frenar; el comportamiento nos va a permitir diferenciar entre tipos de objetos por ejemplo un objeto choche no va a tener los mismos metodos que un objeto avion.

Trasladandonos al mundo de la informatica puede resultarnos mas claro por ejemplo nuestro ordenado tiene un monitor y el estado de este puede ser encendido,apagado,resolución; mientras que su comportamiento puede ser encender , apagar, imprimir.

Los parametros y variables que definen a un objeto se denominan propiedades y las acciones que puede realizar dicho objeto son denominadas metodos o funciones miembro para indicar variables miembro y funciones miembro se utiliza el termino general miembrio

A partir de ahora utilizaremos y a lo largo de las siguiente entregas utilizaremos la nomenclatura artibutos y metodos.

Los atrbutos de un objeto deben encontrase ocultos esto quiere decir que no se va a poder acceder directamente a los atributos de este en este caso surge la pregunta del millon entonces como voy a acceder a los atributos de mis objeto pues de una forma sencilla por medio de metodos que nos permitar tener acceso a ellos.

Los metodos nos van a dar toda la funcionalidad que necesitemos mientras que los atributos de nuestro objeto permanecen ocultos a la vista como la caja negra de un avion al hacer esto estariamos encapsulando el encapsulamiento de un objeto es uno de los pilares de la programación orientada a objetos pero de los pilares de la POO hablaremos en el siguiente articulo.

¿ Sabes como funcionan los Smart Stubs en J2EE ?

Los Smart Stubs son un sistema de acceso distribuido que se está poniendo muy de moda en el mundo de los servidores de aplicaciones.

Uno de los requisitos más importantes de un sistema empresarial es la disponibilidad. Un servidor de aplicaciciones, por ejemplo, ha de estar disponible en todo momento para responder a peticiones de clientes. Tradicionalmente, en los sistemas distribuidos basados en RPC siempre ha existido el problema del punto único de acceso.

La raiz de este problema radica en que para acceder a un servidor de aplicaciones, a pesar de que este pueda estar en un cluster, siempre es necesario acceder a un servidor de control que se encarga de las operaciones de balanceo de carga y de redireccionar la petición del cliente al nodo del cluster más apropiado. Este sistema intermedio es un punto crítico y cualquier fallo en la máquina que lo aloje puede significar la caida del sistema.

Por esta razón poco a poco se han ido poniendo más de moda los stubs inteligentes. La idea de este sistema yace en eliminar ese sistema intermedio de modo que los clientes accedan de manera automática en cada momento al servidor más adecuado dentro del cluster. Para implementar dicho sistema existen numerosas alternativas.

La mayor parte de estas alternativas se basan en el concepto de multicasting. Antes de realizar una petición a un sistema se busca algún servidor disponible. A partir de ahí los algoritmos pueden ser muy diferentes. Por ejemplo, se puede realizar la petición al primer servidor que responda y que éste se encargue de redireccionarla según algún otro algoritmo de balanceo de carga. Otra alternativa sería que fuesen los propios stubs los encargados de elegir entre los diferentes nodos del cluster que hubiesen respondido a nuestra petición, es decir, que la lógica de balanceo de carga se encontráse en los stubs, etc.

Como veis es una tecnología bastante avanzada y que intenta maximizar la disponibilidad del sistema. Servidores de aplicaciones como BEA WebLogic o IBM WebSphere implementan sistemas de este tipo.

¿Sabes qué es un pool de conexiones?

Las conexiones a cualquier medio ( base de datos relacional, sistemas legacy, etc. ) son un recurso caro. Normalmente existe un número limitado de conexiones que puede mantener abiertas un determinado servidor, dependiendo de su memoria, su potencia, del sistema al que estamos accediendo, etc.

Muchos sistemas que actúan como servidores necesitan mantener una gran escalabilidad y por lo tanto no pueden arriesgarse a que se agoten las conexiones. ¿Qué se puede hacer?

Un pool de conexiones soluciona esta técnica. Se trata de un conjunto limitado de conexiones que se reutilizan constantemente para dar servicio a los diferentes clientes. De este modo se aumenta la escalabilidad y tambrión el rendimiento ya que no sería necesario abrir las conexiones constantemente.

Normalmente un pool de conexiones se inicializa con un número de conexiones determinado. Casi todos los servidores modernos traen normalmente pools de conexiones integrados, aunque crearse uno propio no es demasiado difícil.

En un pool de conexiones cada una de ýstas es utilizada por múltiples clientes diferentes. Los clientes abren la conexión, acceden al servicio a través de ella y por último cierran dicha conexión. Es importante que el cliente abra y cierre la conexión en cada acceso al servicio ya que si no la cerrase no la estaría devolviendo al pool y por lo tanto correríamos el riesgo de agotar los recursos del servidor.

Un driver de base de datos puede ofrecer soporte de pools de conexiones si implementa la interfaz javax.sql.DataSource. Este soporte es optativo en JDBC 2.0 y obligatorio en JDBC 3.0

¿Sabías que no conviene utilizar el modelo SingleThreadModel del API de Servlets y JSP?

Los desarrolladores cuando crean JSPs y Servlets se enfrentan a un reto importante: como sincronizar el acceso de múltiples clientes.

Tradicionalmente se han considerado dos opciones: realizar la sincronización manualmente o implementar el modelo SingleThreadModel.

Cuando un Servlet o un JSP implementan el modelo SingleThreadModel el contenedor web garantiza que nunca habrá más de una petición accediendo a la misma instancia de Servlet o JSP.

Internamente esto se consigue de dos modos: creando una cola de peticiones para entrar a cada Servlet y JSP que implementen el modelo SingleThreadModel o creando un pool de instancias del Servlet de modo que se garantice que a cada instancia accede únicamente una petición.

La primera de las opciones supone una degradación importante de rendimiento por lo que normalmente se implementa la segunda. El problema surge en que con este segundo modelo múltiples peticiones accederan al mismo Servlet simultáneamente ( ojo, no a la misma instancia del Servlet ).

Esto es un problema muy grave ya que los desarrolladores pueden creer que no necesitan sincronizar los elementos compartidos a los que acceden ( por ejemplo bases de datos, variables críticas, etc. ) y sin embargo la realidad es que se está accediendo simultánemanete a dichos elementos desde diferentes instancias del Servlet.

Por lo tanto, la diferencia entre utilizar el modelo SingleThreadModel y no utilizarlo es mínima ya que sigue siendo necesario implementar el código de sincronización. Más importante aún, como hemos visto utilizar dicho modelo puede llevar a engaños y producir problemas de difícil depuración.

¿Sabías que conviene ser cuidadoso creando objetos?

La instanciacrión de objetos, una tarea fundamental en los lenguajes orientados a objetos, tiene en Java dos costes asociados que hay que tener en cuenta a la hora de realizar aplicaciones donde los tiempos de respuesta son crýticos.

Por un lado está el coste de reservar memoria para el objeto. Cada objeto consume una determinada cantidad de memoria. Grafos complejos de objetos pueden llegar a consumir bastante memoria y siempre es una buena práctica intentar maximizar la reutilizacrión de este tipo de entidades.

Por otra parte tenemos el coste de seguimiento del objeto. En Java, el proceso de recoleccrión de basura se encarga de liberar automáticamente la memoria que ocupan objetos que no son accesibles. Para poder realizar este proceso de liberacrión es necesario mantener un seguimiento de todos los objetos que se crean en la mýquina virtual. Cada cierto tiempo, el recolector de basura se lanza y chequea todos los objetos creados para ver si existen referencias a los mismos. Cuantos más objetos hayamos creado, más tiempo durarý el proceso de chequeo y menos memoria tenemos disponible. Nuevamente, la reutilizacrión de objetos se muestra como una gran práctica para evitar la creacrión masiva de entidades.

Para poder ver los efectos de la recoleccrión de basura, se puede utilizar el parýmetro -verbose:gc al lanzar la mýquina virtual de Java. De este modo obtendremos informacrión sobre el tiempo gastado en el proceso de recoleccrión de basura, la memoria utilizada y la memoria liberada en cada ejecucrión de dicho proceso.

¿Sabes por qué no se deben utilizar los modelos de datos que trae Swing?

Swing se basa en un modelo MVC, donde la mayor parte de componentes de interfaz (JTable, JList, JComboBox, etc.) tienen un modelo de datos por defecto.

Si no nos creamos un modelo propio estaremos utilizando los modelos por defecto de Swing. Estos modelos utilizan la clase java.util.Vector para el almacenamiento de los datos lo que provocará que nuestros interfaces sean lentos y pesados.

¿Sabías que es preferible no utilizar las clases java.util.Vector y java.util.Hashtable?

Estas clases tienen todos sus métodos sincronizados. Se dice que un método está sincronizado cuando sólo un hilo de ejecución puede acceder a ese método en un instante dado.

La sincronización requiere el uso de objetos monitores de modo que cuando utilizamos vector estamos haciendo un uso intensivo de los mismos.

Imaginad que tenemos una tabla llena de vectores, cada vez que hiciésemos scroll de esa tabla estaríamos adquiriendo y liberando monitores continuamente, lo que redunda en una perdida grandísima en el rendimiento de nuestra aplicación.

Conocer el tamaño de un fichero con Java

Pocas líneas pueden llegar a darnos tanta información. Este es el caso en el que queramos conocer el tamaño de un fichero utilizando el lenguaje Java. Toda la información está contenida en la clase File.
/**
* @file TamanioFichero.java
* @version 1.1
* @author Linea de Codigo (http://lineadecodigo.com)
* @date 7-julio-07
* @url http://lineadecodigo.com/2007/07/07/conocer-el-tamano-de-un-fichero-con-java/
* @description Conocer el tamaño de un fichero, en bytes, mediante la librería java.io.
*/

import java.io.File;

public class TamanioFichero {

public static void main(String[] args) {

String sFichero = "c:\\prueba.xml";
File fichero = new File(sFichero);
System.out.println("El tamaño del fichero " + sFichero +
" es: " + Long.toString(fichero.length()) + " bytes");

}

}


Elemento maximo y minimo de un conjunto con Objetos

Utilización del interface Comparator para comparar objetos y poder utilizar los métodos .max y .min de Collections.

* @file ElementoMaximoMinimoConjunto.java
* @version 1.1
* @author Linea de Codigo (http://lineadecodigo.com)
* @date 8-julio-2007
* @url http://http://lineadecodigo.com/2007/07/08/elemento-maximo-y-minimo-de-un-conjunto-con-objetos/
* @description Como utilizar los métodos .max y .min de la clase Collections con objetos. Utilización del interface Comparator.
*/


import java.util.*;
import com.lineadecodigo.base.Persona;

public class ElementoMaximoMinimoConjunto {

public static void main(java.lang.String[] args) {

Set hs2 = new HashSet();

hs2.add(new Persona("Victor",29));
hs2.add(new Persona("Amaya",30));
hs2.add(new Persona("Jose",57));
hs2.add(new Persona("Sonsoles",50));

try {

// Definimos el comparador

Comparator comparador = new Comparator(){

public int compare(Persona p1, Persona p2) {
return (p1.getEdad()-p2.getEdad());

}
};

// Ejecutamos los métodos .max y .min
System.out.println(Collections.max(hs2,comparador).getNombre());
System.out.println(Collections.max(hs2,comparador).getNombre());



} catch (Exception e){
System.out.println(e.toString());
}
}

}

Elemento maximo y minimo de un conjunto con Objetos

Utilización del interface Comparator para comparar objetos y poder utilizar los métodos .max y .min de Collections.

* @file ElementoMaximoMinimoConjunto.java
* @version 1.1
* @author Linea de Codigo (http://lineadecodigo.com)
* @date 8-julio-2007
* @url http://http://lineadecodigo.com/2007/07/08/elemento-maximo-y-minimo-de-un-conjunto-con-objetos/
* @description Como utilizar los métodos .max y .min de la clase Collections con objetos. Utilización del interface Comparator.
*/


import java.util.*;
import com.lineadecodigo.base.Persona;

public class ElementoMaximoMinimoConjunto {

public static void main(java.lang.String[] args) {

Set hs2 = new HashSet();

hs2.add(new Persona("Victor",29));
hs2.add(new Persona("Amaya",30));
hs2.add(new Persona("Jose",57));
hs2.add(new Persona("Sonsoles",50));

try {

// Definimos el comparador

Comparator comparador = new Comparator(){

public int compare(Persona p1, Persona p2) {
return (p1.getEdad()-p2.getEdad());

}
};

// Ejecutamos los métodos .max y .min
System.out.println(Collections.max(hs2,comparador).getNombre());
System.out.println(Collections.max(hs2,comparador).getNombre());



} catch (Exception e){
System.out.println(e.toString());
}
}

}

¡Descarga NetBeans!

Descarga la última versión del NetBeans IDE.

Si estás interesado en la construcción de una aplicación sobre NetBeans Platform, descarga el lanzamiento último de la Plataforma

¿Qué es NetBeans?

NetBeans es un proyecto de código abierto de gran éxito con una gran base de usuarios, una comunidad en constante crecimiento, y con cerca de 100 socios (¡y subiendo!) en todo el mundo. Sun MicroSystems fundó el proyecto de código abierto NetBeans en junio 2000 y continúa siendo el patrocinador principal de los proyectos.

A día de hoy hay disponibles dos productos: el NetBeans IDE y el NetBeans Plataform.

El NetBeans IDE es un entorno de desarrollo - una herramienta para programadores pensada para escribir, compilar, depurar y ejecutar programas. Está escrito en Java - pero puede servir para cualquier otro lenguaje de programación. Existe además un número importante de módulos para extender el IDE NetBeans. El IDE NetBeans es un producto libre y gratuito sin restricciones de uso.

También disponible está el NetBeans Platform; una base modular y extensible usada como una estructura de integración para crear aplicaciones de escritorio grandes. Empresas independientes asociadas, especializadas en desarrollo de software, proporcionan extensiones adicionales que se integran fácilmente en la plataforma y que pueden también utilizarse para desarrollar sus propias herramientas y soluciones.

Ambos productos son de código abierto y gratuitos para el uso tanto comercial y como no comercial. El código fuente está disponible para su reutilización de acuerdo con la Common Development and Distribution License (CDDL).

Cómo poner borde a un JComponent

//llamando al color por su nombre

JComponent.setBorder(BorderFactory.createLineBorder(Color.black));

//creando una variable Color

Color color = new Color(131,111,255);
JComponent.setBorder(BorderFactory.createLineBorder(color ,2));
Tipos de borde en la clase BorderFactory:
  • createEmptyBorder((int top, int left, int bottom, int right)
  • createLineBorder(Color.color, int thickness)
  • createMatteBorder(int top, int left, int bottom, int right, Color.color)
  • createLoweredBevelBorder()
  • createRaisedBevelBorder()

Cómo usar la decoración LookAndFeel de Java:

JFrame.setDefaultLookAndFeelDecorated(true);
//instanciar JFrame después de configurar la decoración
JFrame marco = new JFrame();

Cómo pedir la introducción de texto (showInputDialog)

//pedir la introducción de texto

String s = (String)JOptionPane.showInputDialog(null,
"Escribe tu nombre:\n",
"Input",
JOptionPane.PLAIN_MESSAGE);

//si el usuario ha escrito algo

if ((s != null) && (s.length() > 0)) {
JOptionPane.showMessageDialog(null,
"Hola, " + s + ".",
"Bienvenido",
JOptionPane.INFORMATION_MESSAGE);
return; }

//si no ha escrito nada

JOptionPane.showMessageDialog(null,
"Es obligatorio escribir tu nombre.",
"Error",
JOptionPane.ERROR_MESSAGE);

Cómo hacer cuadros de diálogo simples

//título e icono por defecto

JOptionPane.showMessageDialog(null,"Texto del mensaje.");

//título personalizado, icono de aviso

JOptionPane.showMessageDialog(null,
"Texto del mensaje.",
"Título del marco",
JOptionPane.WARNING_MESSAGE);

//título personalizado, icono de error

JOptionPane.showMessageDialog(null,
"Texto del mensaje.",
"Título del marco",
JOptionPane.ERROR_MESSAGE);

//título personalizado, sin icono

JOptionPane.showMessageDialog(null,
"Texto del mensaje.",
"Título del marco",
JOptionPane.PLAIN_MESSAGE);

Cómo hacer cuadros de diálogo simples

//título e icono por defecto

JOptionPane.showMessageDialog(null,"Texto del mensaje.");

//título personalizado, icono de aviso

JOptionPane.showMessageDialog(null,
"Texto del mensaje.",
"Título del marco",
JOptionPane.WARNING_MESSAGE);

//título personalizado, icono de error

JOptionPane.showMessageDialog(null,
"Texto del mensaje.",
"Título del marco",
JOptionPane.ERROR_MESSAGE);

//título personalizado, sin icono

JOptionPane.showMessageDialog(null,
"Texto del mensaje.",
"Título del marco",
JOptionPane.PLAIN_MESSAGE);

Generación de números aleatorios en Java

Hay varias formas de generar números aleatorios con las librerías de JAVA 2. Si no usamos el método adecuado, probablemente obtendremos resultados inesperados o mal distribuidos en la generación de números aleatorios.
La clase java.util.Random está disponible desde la versión 1.2 del SDK. La clase tiene un método nextInt() que acepta un argumento entero.

public int nextInt(int n)

Dado algún valor mayor o igual cero pero menor que el entero pasado: 0 <= nextInt() < n.
Como muestra, aquí vemos el código que genera un conjunto de números aleatorios e imprime la media:

int count = 1000000;


int range = Integer.MAX_VALUE / 3 * 2;


double sum = 0;


Random rand = new Random();


for (int i=0; i


sum += rand.nextInt(range);


}


System.out.println(sum/count);


Existen métodos más antiguos, como el uso de la función nextInt() sin parámetros y después aplicar el operador abs y %, de la siguiente forma:

Math.abs(rand.nextInt()) % range;

Pero no es un sistema equivalente