La ocultación y el encapsulamiento

Permitir acceso directo a las propiedades de un objeto es peligroso: se podrían modificar estados sin respetar las reglas de validación. La solución es declarar las propiedades como private:

public class Bombilla {
    private int potencia;
    private int numEncendidos;
    private Boolean encendida, fundida;
}

Se introduce entonces el concepto de getters (métodos de consulta) y setters (métodos modificadores):

public int obtenerNumEncendido() {
    return numEncendidos;
}

public void establecerPotencia(int nuevaPotencia) {
    if (nuevaPotencia > 0)
        potencia = nuevaPotencia;
}

Eclipse puede generar automáticamente getters y setters mediante Source → Generate Getters and Setters.

El objeto en primera persona. Referencia this

this hace referencia al propio objeto y sirve para resolver conflictos de nombres entre parámetros y propiedades:

public void establecerPotencia(int potencia) {
    if (potencia > 0)
        this.potencia = potencia;
}

Sobrecarga de métodos

Reglas para sobrecargar métodos:

  • Mismo nombre y tipo de retorno.
  • Se distinguen por número y/o tipo de parámetros.
  • La visibilidad no sirve para distinguirlos.

Ejemplo de sobrecarga en constructores y métodos

El modificador static

Las propiedades y métodos static pertenecen a la clase, no a los objetos individuales. Son compartidos por todas las instancias:

public class Bombilla {
    private static int consumoTotal = 0;

    public static int getConsumoTotalBombillas() {
        return consumoTotal;
    }
}

Se accede a través del nombre de la clase:

System.out.println(Bombilla.getConsumoTotalBombillas() + "W");

La clase Math de la librería estándar y System.out.println son ejemplos habituales de uso de métodos estáticos.

Concepto y notación UML de paquetes

Los paquetes agrupan clases relacionadas. Por ejemplo, un paquete electrodomesticos podría contener las clases Bombilla, Televisor, Video y MandoUniversal.

Diagrama UML de paquetes

Declaración de un paquete

La declaración de paquete debe ser la primera línea del fichero:

package nombreDelPaquete;

Reglas de nombrado:

  • Minúsculas, sin espacios.
  • Comenzar con letra, $ o _.
  • No pueden ser palabras reservadas.
  • Paquetes anidados separados por puntos.

Ejemplos correctos: utilidades, gestionClientes, utilidades.graficos, utilidades.sonidos

Ejemplos incorrectos: 12meses, static, future-soft, double.number

El espacio de nombres

Los paquetes evitan conflictos de nombres: dos clases pueden tener el mismo nombre si pertenecen a paquetes distintos.

La convención de nombres usa el dominio inverso de la empresa:

  • www.endesa.comcom.endesa.servicios, com.endesa.facturacion
  • www.sadiel.eses.sadiel.servicios, es.sadiel.facturacion

La estructura de carpetas asociada

Hay una relación directa entre paquetes y carpetas: cada paquete corresponde a una carpeta, y cada clase a un fichero .java.

Estructura de carpetas correspondiente a los paquetes

Clases visibles dentro y fuera de un paquete

Las clases declaradas con public son visibles dentro y fuera del paquete. Sin modificador de acceso, solo son visibles dentro del paquete.

Visibilidad amigable o de paquete: Sin public ni private:

int codigoCliente;
boolean propietario;
void imprimeCliente() {  }

En UML se denota sin símbolo de visibilidad.

Niveles de acceso entre clases del mismo paquete

Sentencias de importación

Para usar clases de otros paquetes se usa import:

import utilidades.Teclado;
import utilidades.graficos.*;

Eclipse puede conectarse con la documentación estándar de Java para ofrecer información contextual durante el desarrollo.