Inicio > Cursos > Java > Proyecto: Sistema Bancario
JavaJava ModernoLección 14 de 15

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);
    }
}
Consejo🏦 Collections.unmodifiableList() devuelve una vista inmutable de la lista. El caller no puede modificarla, pero sí leerla.
← Excepciones y Manejo de ErroresSpring Boot: APIs y Microservicios →

Practica esta lección

Resuelve los ejercicios del curso de Java en la app, gratis y con corrección automática.

Empezar a practicar