jueves, 7 de abril de 2016

Uso de arrays redimensionables en Java



Suponga que se desea almacenar en arrays redimensionables el catálogo de vehículos y la relación de clientes de la empresa de alquiler de vehículos. 
Basta con sustituir los arrays de la clase EmpresaAlquilerVehiculos por objetos de tipo ArrayList y modificar los métodos de la clase que utilizan los objetos clientes, vehículos y alquileres.

En esta nueva implementación de la clase, no es necesario definir variables para almacenar el total de clientes, vehículos o vehículos alquilados. Un ArrayList es un array que modifica su tamaño de forma dinámica para almacenar tantos elementos como sea necesario.

La nueva clase EmpresaAlquilerVehiculos declara los objetos clientes, vehículos y alquileres de tipo ArrayList para almacenar la información de los clientes, el catálogo de vehículos y el histórico de vehículos alquilados, respectivamente.

import java.util.ArrayList;
import java.util.List;
public class EmpresaAlquilerVehiculos {
private String cif;
private String nombre;
private String paginaWeb;
private List <Cliente> clientes;
private List <Vehiculo> vehiculos;
private List <VehiculoAlquilado> alquileres;
// se omiten los métodos ‘get’ y ‘set’ de la clase
public EmpresaAlquilerVehiculos (String cif,
String nombre,
String paginaWeb) {
this.cif = cif;
this.nombre = nombre;
this.paginaWeb = paginaWeb;
this.clientes = new ArrayList<Cliente>();
this.vehiculos = new ArrayList<Vehiculo>();
this.alquileres = new ArrayList<VehiculoAlquilado>();
}
}

La clase EmpresaAlquilerVehiculos declara los siguientes métodos para realizar operaciones:

  • registrarCliente(Cliente cliente). Añade un nuevo cliente a la lista de clientes de la empresa.
  • registrarVehiculo(Vehiculo vehiculo). Añade un vehículo al catálogo de vehículos de la empresa.
  • imprimirClientes(). Muestra la relación de clientes de la empresa.
  • imprimirVehiculos(). Muestra el catálogo de vehículos de la empresa.
  • alquilarVehiculo(String matricula,String nif,int dias). Modifica la disponibilidad del vehículo para indicar que está alquilado y añade un objeto de tipo VehiculoAlquilado a la lista de vehículos alquilados. Esta lista almacena el cliente, el vehículo y los días de alquiler de cada vehículo alquilado.
  • recibirVehiculo(String matricula). Modifica la disponibilidad del vehículo para que se pueda alquilar de nuevo.

El método registrarCliente(Cliente cliente) añade un objeto de la clase Cliente a la lista clientes.

public void registrarCliente(Cliente cliente) {
this.clientes.add(cliente);
}

El método registrarVehiculo(Vehiculo vehiculo) añade un objeto de la clase Vehiculo a lista vehiculos.

public void registrarVehiculo(Vehiculo vehiculo) {
this.vehiculos.add(vehiculo);
}

El método imprimirClientes() muestra la relación de clientes de la empresa de alquiler.

public void imprimirClientes() {
System.out.println("NIF cliente\tNombre\n");
for (Cliente c : this.clientes)
System.out.println(c.getAtributos());
}

El método imprimirVehiculos() muestra el catálogo de vehículos de la empresa de alquiler. El método getAtributosInforme() muestra el detalle de atributos del vehículo.

public void imprimirVehiculos() {
System.out.println("Matricula\tModelo " +
"\tImporte Disponible\n");
for (Vehiculo v : this.vehiculos)
System.out.println(v.getAtributosInforme());
}

Para registrar el alquiler de un vehículo por un cliente se usa el método alquilarVehiculo(String matricula, String nif, int dias).
Este método modifica la disponibilidad del vehículo para indicar que está alquilado. El método getCliente(String nif) busca la referencia del cliente con el NIF dado en la lista clientes. De forma similar, el método getVehiculo(String matricula) busca la referencia del vehiculo con la matrícula dada en la lista vehiculos. Una vez encontrado el vehículo con la matricula indicada, se verifica si está disponible para alquilar y se modifica su disponibilidad. A continuación, almacena un objeto de tipo VehiculoAlquilado en la lista alquileres. Este objeto relaciona un cliente, un vehículo, la fecha actual y los días de alquiler.

El método getCliente(String nif).

private Cliente getCliente(String nif) {
for (Cliente c : this.clientes)
if (c.getNIF() == nif)
return c;
return null;
}

public void alquilarVehiculo(String matricula,
String nif,
int dias) {
Cliente cliente = getCliente(nif);
Vehiculo vehiculo = getVehiculo(matricula);
if (vehiculo.getDisponible()) {
vehiculo.setDisponible(false);
this.alquileres.add(
new VehiculoAlquilado(cliente, vehiculo,
diaHoy(), mesHoy(), añoHoy(), dias));
}
}

El método recibirVehiculo(String matricula) modifica la disponibilidad del vehículo para que se pueda alquilar de nuevo. Este método utiliza el método getVehiculo(String matricula) que busca el vehículo con la matrícula dada en la lista vehiculos. Si lo encuentra, modifica su disponibilidad para indicar que nuevamente está disponible para alquiler.

public void recibirVehiculo(String matricula) {
Vehiculo vehiculo = getVehiculo(matricula);
if (vehiculo != null)
vehiculo.setDisponible(true);
}

Una vez modificada la clase EmpresaAlquilerVehiculos, es importante ver que los cambios realizados a las variables privadas de la clase solo afectan a la implementación de los métodos de esta clase. Las modificaciones quedan “encapsuladas” dentro de la clase y no afectan a otras clases o programas.
Esto significa que no es necesario modificar la clase MisVehiculos que registra los clientes y los vehículos de la empresa de alquiler. El método main() crea una instancia de la clase EmpresaAlquilerVehiculos, denominada easydrive con CIF “A-28-187189”, nombre “easydrive” y página web “www.easydrive.com”.

// la instancia easydrive de EmpresaAlquilerVehiculos
EmpresaAlquilerVehiculos easydrive = new
EmpresaAlquilerVehiculos("A-28-187189", "easy drive",
"www.easydrive.com");

Al crear la instancia easydrive, el método constructor de la clase EmpresaAlquilerVehiculos inicializa las listas clientes y vehiculos de este objeto. Una vez creada la instancia es necesario añadir clientes y vehículos al objeto easydrive. En este ejemplo se registran dos clientes y cinco vehículos de alquiler: tres turismos, un deportivo y una furgoneta.
Para registrar un nuevo cliente basta con invocar el método registrarCliente(Cliente cliente) con una instancia de la clase Cliente para añadir un nuevo cliente a la lista clientes del objeto easydrive.

// registro del cliente con NIF "X5618927C"
easydrive.registrarCliente(new Cliente("X5618927C",
"Juan","González López"));

Para registrar un nuevo vehículo basta con invocar el método registrarVehiculo(Vehiculo vehiculo) con una instancia de la clase Vehiculo para añadir un nuevo vehículo a la lista vehiculos del objeto easydrive.

// registro del turismo con matrícula "4060 TUR"
easydrive.registrarVehiculo(new Turismo("4060 TUR",
"Skoda","Fabia", "Blanco",
90.0, 2, false));

Una vez registrados los clientes y los vehículos de la empresa, se invocan los métodos imprimirClientes() e imprimirVehiculos() para mostrar la relación de clientes y el catálogo de vehículos de la empresa “easydrive”.

// imprime la relación de clientes de "easydrive"
easydrive.imprimirClientes();
// imprime el catálogo de vehículos de "easydrive"
easydrive.imprimirVehiculos();

import java.util.ArrayList;
import java.util.List;
public class EmpresaAlquilerVehiculos {
// se omiten los atributos y el resto de métodos de la clase
public void registrarCliente(Cliente cliente) {
this.clientes.add(cliente);
}
public void registrarVehiculo(Vehiculo vehiculo) {
this.vehiculos.add(vehiculo);
}
public void imprimirClientes() {
System.out.println("NIF cliente\tNombre\n");
for (Cliente c : this.clientes)
System.out.println(c.getAtributos());
}
public void imprimirVehiculos() {
System.out.println("Matricula\tModelo " +
"\tImporte Disponible\n");
for (Vehiculo v : this.vehiculos)
System.out.println(v.getAtributosInforme());
}
public void alquilarVehiculo(String matricula,
String nif,
int dias) {
Cliente cliente = getCliente(nif);
Vehiculo vehiculo = getVehiculo(matricula);
if (vehiculo.getDisponible()) {
vehiculo.setDisponible(false);
this.alquileres.add(
new VehiculoAlquilado(cliente, vehiculo,
diaHoy(), mesHoy(), añoHoy(), dias));
}
}
public void recibirVehiculo(String matricula) {
Vehiculo vehiculo = getVehiculo(matricula);
if (vehiculo != null)
vehiculo.setDisponible(true);
}
}

El programa principal de la aplicación.

public class MisVehiculos {
public static void main(String[] args) {
// la instancia easydrive de la clase EmpresaAlquilerVehiculos
EmpresaAlquilerVehiculos easydrive = new
EmpresaAlquilerVehiculos("A-28-187189", "easy drive",
"www.easydrive.com");
// registro de los clientes de la empresa
easydrive.registrarCliente(new Cliente("X5618927C",
"Juan", "González López"));
easydrive.registrarCliente(new Cliente("Z7568991Y",
"Luis", "Fernández Gómez"));
// registro de los vehículos de la empresa
easydrive.registrarVehiculo(new Turismo("4060 TUR", "Skoda",
"Fabia", "Blanco", 90.0, 2, false));
easydrive.registrarVehiculo(new Deportivo("4070 DEP", "Ford",
"Mustang", "Rojo", 150.0, 2000));
easydrive.registrarVehiculo(new Turismo("4080 TUR", "VW", "GTI",
"Azul", 110.0, 2, false));
easydrive.registrarVehiculo(new Turismo("4090 TUR", "SEAT",
"Ibiza", "Blanco", 90.0, 4, false));
easydrive.registrarVehiculo(new Furgoneta("4100 FUR", "Fiat",
"Ducato", "Azul", 80.0, 1200, 8));
// imprime la relación de clientes de easydrive
easydrive.imprimirClientes();
// imprime el catálogo de vehículos de easydrive
easydrive.imprimirVehiculos();
}
}



Espero haber ayudado en algo. Hasta la próxima oportunidad!











  

No hay comentarios:

Publicar un comentario en la entrada