JavaRush /Blog Java /Random-ES /Pausa para el café #201. Cómo crear una aplicación bancar...

Pausa para el café #201. Cómo crear una aplicación bancaria de consola en Java

Publicado en el grupo Random-ES
Fuente: Medio Hoy desarrollaremos una aplicación Java sencilla para un sistema bancario. Nos ayudará a comprender mejor cómo se utilizan los conceptos de programación orientada a objetos en los programas Java. Pausa para el café #201.  Cómo crear una aplicación bancaria de consola en Java - 1Para empezar, necesitaremos un entorno Java instalado en el ordenador, preferiblemente Java 11. A continuación, comenzaremos con una descripción detallada de las funciones de la aplicación de consola. Funcional:
  1. Crea una cuenta;
  2. Entrada salida;
  3. Visualización de las últimas 5 transacciones;
  4. Depósito en efectivo;
  5. Mostrar información del usuario actual.
Conceptos de programación orientada a objetos utilizados:
  1. Herencia;
  2. Polimorfismo;
  3. Encapsulación.

Desarrollo de aplicaciones

Creemos un nuevo proyecto Java en Eclipse o IntelliJ IDEA. Definamos una nueva interfaz llamada SavingsAccount .
public interface SavingsAccount {

    void deposit(double amount, Date date);
}
He implementado una interfaz que aloja el método de depósito . Llamo a este método cada vez que agrego dinero a mi cuenta corriente. El concepto de programación orientada a objetos utilizado aquí es el polimorfismo (los métodos en una interfaz no tienen cuerpo). La implementación de este método se puede encontrar en la clase Cliente anulando un método con el mismo nombre y parámetros. De esta manera, anula un método de la interfaz principal en la clase secundaria. Luego necesitamos que un cliente agregue dinero a la cuenta corriente. Pero primero, definamos nuestra clase Cliente .
public class Customer extends Person implements SavingsAccount {

    private String username;

    private String password;

    private double balance;

    private ArrayList<String> transactions = new ArrayList<>(5);

    public Customer(String firstName, String lastName, String address, String phone, String username, String password, double balance, ArrayList<String> transactions, Date date) {
        super(firstName, lastName, address, phone);
        this.username = username;
        this.password = password;
        this.balance = balance;
        addTransaction(String.format("Initial deposit - " + NumberFormat.getCurrencyInstance().format(balance) + " as on " + "%1$tD" + " at " + "%1$tT.", date));
    }

    private void addTransaction(String message) {

        transactions.add(0, message);
        if (transactions.size() > 5) {
            transactions.remove(5);
            transactions.trimToSize();
        }
    }

//Getter Setter

    public ArrayList<String> getTransactions() {
        return transactions;
    }

    @Override
    public void deposit(double amount, Date date) {

        balance += amount;
        addTransaction(String.format(NumberFormat.getCurrencyInstance().format(amount) + " credited to your account. Balance - " + NumberFormat.getCurrencyInstance().format(balance) + " as on " + "%1$tD" + " at " + "%1$tT.", date));
    }

    @Override
    public String toString() {
        return "Customer{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", balance=" + balance +
                ", transactions=" + transactions +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Customer customer = (Customer) o;

        if (Double.compare(customer.getBalance(), getBalance()) != 0) return false;
        if (getUsername() != null ? !getUsername().equals(customer.getUsername()) : customer.getUsername() != null)
            return false;
        if (getPassword() != null ? !getPassword().equals(customer.getPassword()) : customer.getPassword() != null)
            return false;
        return getTransactions() != null ? getTransactions().equals(customer.getTransactions()) : customer.getTransactions() == null;
    }

    @Override
    public int hashCode() {
        int result;
        long temp;
        result = getUsername() != null ? getUsername().hashCode() : 0;
        result = 31 * result + (getPassword() != null ? getPassword().hashCode() : 0);
        temp = Double.doubleToLongBits(getBalance());
        result = 31 * result + (int) (temp ^ (temp >>> 32));
        result = 31 * result + (getTransactions() != null ? getTransactions().hashCode() : 0);
        return result;
    }
El concepto de programación orientada a objetos utilizado aquí es la herencia , ya que la clase Cliente recibe propiedades de la clase Persona . Es decir, casi todos los atributos de la clase Persona se heredan y las relaciones padre-hijo son visibles de Persona a Cliente . Ahora necesitamos un constructor con todos los atributos de las dos clases y agregar una palabra clave de superconstructor para especificar los atributos heredados. Al implementar la interfaz SavingsAccount , debemos anular el método de depósito en la clase Cliente . Para hacer esto, escribiremos una implementación del método en esta clase. Además, la lista de transacciones se inicializa para mostrar las últimas cinco transacciones. El constructor llama al método addTransaction , que muestra la fecha de los cambios y las transacciones completadas.
private void addTransaction(String message) {

        transactions.add(0, message);
        if (transactions.size() > 5) {
            transactions.remove(5);
            transactions.trimToSize();
        }
    }
Ahora hablemos de la clase principal Persona .
public class Person {

    private String firstName;

    private String lastName;

    private String address;

    private String phone;

    public Person() {}

    public Person(String firstName, String lastName, String address, String phone) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
        this.phone = phone;
    }

//Getters Setters

 @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (getFirstName() != null ? !getFirstName().equals(person.getFirstName()) : person.getFirstName() != null)
            return false;
        if (getLastName() != null ? !getLastName().equals(person.getLastName()) : person.getLastName() != null)
            return false;
        if (getAddress() != null ? !getAddress().equals(person.getAddress()) : person.getAddress() != null)
            return false;
        return getPhone() != null ? getPhone().equals(person.getPhone()) : person.getPhone() == null;
    }

    @Override
    public int hashCode() {
        int result = getFirstName() != null ? getFirstName().hashCode() : 0;
        result = 31 * result + (getLastName() != null ? getLastName().hashCode() : 0);
        result = 31 * result + (getAddress() != null ? getAddress().hashCode() : 0);
        result = 31 * result + (getPhone() != null ? getPhone().hashCode() : 0);
        return result;
    }
En la clase Persona , utilizamos el concepto de encapsulación aplicando el modificador de acceso privado a cada atributo. La encapsulación en Java se puede definir como el mecanismo mediante el cual los métodos que operan con estos datos se combinan en una sola unidad. Básicamente, los datos de la clase Persona sólo están disponibles en esta clase y no en otras clases o paquetes. Y finalmente, nuestra clase principal, llamada Banco . Esta es la clase principal desde donde ejecutamos la aplicación e interactuamos con la funcionalidad de todas las clases.
public class Bank {

    private static double amount = 0;
    Map<String, Customer> customerMap;

    Bank() {
        customerMap = new HashMap<String, Customer>();
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        Customer customer;
        Bank bank = new Bank();
        int choice;
        outer:
        while (true) {

            System.out.println("\n-------------------");
            System.out.println("BANK    OF     JAVA");
            System.out.println("-------------------\n");
            System.out.println("1. Registrar cont.");
            System.out.println("2. Login.");
            System.out.println("3. Exit.");
            System.out.print("\nEnter your choice : ");
            choice = sc.nextInt();
            sc.nextLine();
            switch (choice) {
                case 1:
                    System.out.print("Enter First Name : ");
                    String firstName = sc.nextLine();
                    System.out.print("Enter Last Name : ");
                    String lastName = sc.nextLine();
                    System.out.print("Enter Address : ");
                    String address = sc.nextLine();
                    System.out.print("Enter contact number : ");
                    String phone = sc.nextLine();
                    System.out.println("Set Username : ");
                    String username = sc.next();
                    while (bank.customerMap.containsKey(username)) {
                        System.out.println("Username already exists. Set again : ");
                        username = sc.next();
                    }
                    System.out.println("Set a password:");
                    String password = sc.next();
                    sc.nextLine();

                    customer = new Customer(firstName, lastName, address, phone, username, password, new Date());
                    bank.customerMap.put(username, customer);
                    break;

                case 2:
                    System.out.println("Enter username : ");
                    username = sc.next();
                    sc.nextLine();
                    System.out.println("Enter password : ");
                    password = sc.next();
                    sc.nextLine();
                    if (bank.customerMap.containsKey(username)) {
                        customer = bank.customerMap.get(username);
                        if (customer.getPassword().equals(password)) {
                            while (true) {
                                System.out.println("\n-------------------");
                                System.out.println("W  E  L  C  O  M  E");
                                System.out.println("-------------------\n");
                                System.out.println("1. Deposit.");
                                System.out.println("2. Transfer.");
                                System.out.println("3. Last 5 transactions.");
                                System.out.println("4. User information.");
                                System.out.println("5. Log out.");
                                System.out.print("\nEnter your choice : ");
                                choice = sc.nextInt();
                                sc.nextLine();
                                switch (choice) {
                                    case 1:
                                        System.out.print("Enter amount : ");
                                        while (!sc.hasNextDouble()) {
                                            System.out.println("Invalid amount. Enter again :");
                                            sc.nextLine();
                                        }
                                        amount = sc.nextDouble();
                                        sc.nextLine();
                                        customer.deposit(amount, new Date());
                                        break;

                                    case 2:
                                        System.out.print("Enter beneficiary username : ");
                                        username = sc.next();
                                        sc.nextLine();
                                        System.out.println("Enter amount : ");
                                        while (!sc.hasNextDouble()) {
                                            System.out.println("Invalid amount. Enter again :");
                                            sc.nextLine();
                                        }
                                        amount = sc.nextDouble();
                                        sc.nextLine();
                                        if (amount > 300) {
                                            System.out.println("Transfer limit exceeded. Contact bank manager.");
                                            break;
                                        }
                                        if (bank.customerMap.containsKey(username)) {
                                            Customer payee = bank.customerMap.get(username); //Todo: check
                                            payee.deposit(amount, new Date());
                                            customer.withdraw(amount, new Date());
                                        } else {
                                            System.out.println("Username doesn't exist.");
                                        }
                                        break;

                                    case 3:
                                        for (String transactions : customer.getTransactions()) {
                                            System.out.println(transactions);
                                        }
                                        break;

                                    case 4:
                                        System.out.println("Titularul de cont cu numele: " + customer.getFirstName());
                                        System.out.println("Titularul de cont cu prenumele : " + customer.getLastName());
                                        System.out.println("Titularul de cont cu numele de utilizator : " + customer.getUsername());
                                        System.out.println("Titularul de cont cu addresa : " + customer.getAddress());
                                        System.out.println("Titularul de cont cu numarul de telefon : " + customer.getPhone());
                                        break;
                                    case 5:
                                        continue outer;
                                    default:
                                        System.out.println("Wrong choice !");
                                }
                            }
                        } else {
                            System.out.println("Wrong username/password.");
                        }
                    } else {
                        System.out.println("Wrong username/password.");
                    }
                    break;

                case 3:
                    System.out.println("\nThank you for choosing Bank Of Java.");
                    System.exit(1);
                    break;
                default:
                    System.out.println("Wrong choice !");
            }}}}
Usando la biblioteca java.util , llamamos a Scanner para leer el teclado. Al convertir el objeto Cliente a través de su definición, conocida como Banco , creamos un nuevo objeto de tipo Banco() . Pasado un tiempo, desplegamos el menú de inicio. Cuando se usa nextLine , se lee el número agregado desde el teclado. A continuación tenemos un nuevo constructor que guarda nuestro mapa , los datos del cliente. Map.put se utiliza para guardar o actualizar los datos del cliente. cliente = nuevo Cliente(nombre, apellido, dirección, teléfono, nombre de usuario, contraseña, nueva Fecha());
bank.customerMap.put(username, customer);
Si hay conexión, obtenemos un nuevo menú con opciones. El mismo enfoque funciona usando while y cambiando a la funcionalidad de la aplicación de llamada. Etapa 1: agregue dinero a su cuenta corriente. Paso 2: muestra las últimas 5 transacciones. Etapa 3: enviamos los datos del cliente desde la tarjeta a la consola. Etapa 4: cierra el menú. El código fuente del programa se puede encontrar aquí . Espero que este ejemplo le ayude a familiarizarse más con el uso de conceptos de programación orientada a objetos en Java.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION