Proyecto: Sistema Bancario
Este proyecto integra todos los conceptos del curso en un sistema bancario real: encapsulamiento (atributos private con getters) para proteger el saldo, excepciones personalizadas (SaldoInsuficienteException) para comunicar errores del negocio, Collections (ArrayList) para el historial de transacciones, y métodos que coordinan operaciones complejas como transferencias entre cuentas que involucran tanto débito como crédito.
La clase final del proyecto demuestra patrones de diseño profesional: el atributo historial es private y se expone como lista inmutable con Collections.unmodifiableList() (el exterior puede leer pero no modificar), el número de cuenta es final (no cambia después de la creación), y cada operación valida sus parámetros lanzando excepciones descriptivas si son inválidos. Esta arquitectura defensiva es el estándar en sistemas financieros donde la consistencia de datos es crítica.
import java.util.*;
import java.util.stream.*;
public class CuentaBancaria {
private final String numero;
private final String titular;
private double saldo;
private final List<String> historial = new ArrayList<>();
public CuentaBancaria(String numero, String titular, double saldoInicial) {
this.numero = numero;
this.titular = titular;
this.saldo = saldoInicial;
registrar("Apertura de cuenta: $" + saldoInicial);
}
public void depositar(double monto) {
if (monto <= 0) throw new IllegalArgumentException("Monto debe ser positivo");
saldo += monto;
registrar("Depósito: +$" + monto);
}
public void retirar(double monto) {
if (monto <= 0) throw new IllegalArgumentException("Monto debe ser positivo");
if (monto > saldo) throw new SaldoInsuficienteException(saldo, monto);
saldo -= monto;
registrar("Retiro: -$" + monto);
}
public void transferir(CuentaBancaria destino, double monto) {
this.retirar(monto);
destino.depositar(monto);
registrar("Transferencia a " + destino.numero);
}
private void registrar(String operacion) {
historial.add(new Date() + " - " + operacion);
}
// Getters
public double getSaldo() { return saldo; }
public List<String> getHistorial() {
return Collections.unmodifiableList(historial);
}
@Override
public String toString() {
return String.format("Cuenta %s (%s): $%.2f", numero, titular, saldo);
}
}
Practica esta lección
Resuelve los ejercicios del curso de Java en la app, gratis y con corrección automática.
Empezar a practicar