Soluzione 4.5

La classe BankAccount modificata: attenzione all'uso di variabili static.
public class BankAccount
{
    public BankAccount()
    {
        balance =0;
        lastAssignedNumber++;
        accountNumber = lastAssignedNumber;
    }

    public boolean deposit(double amount)
    {
        if (amount > 0)
        {
            balance = balance + amount;
            return true;
        }
        /*
            Come mai non c'e` un else e funziona lo stesso?
            Ovvero, come mai il metodo non restituisce sempre false?
        */
        return false;
    }

    public boolean withdraw(double amount)
    {
        if (amount <= balance && amount > 0)
        {
            balance = balance - amount;
            return true;
        }
        return false;
    }

    public double getBalance()
    {
        return balance;
    }

    public int getAccountNumber()
    {
        return accountNumber;
    }

    private static int lastAssignedNumber = 10000;
    private int accountNumber;
    private double balance;
}
La classe di collaudo BankAccountTester. Studiare con attenzione le decisioni nidificate che realizzano la gestione dell'immissione comandi. Nelle verifiche degli if abbiamo usato il metodo hasNext di Scanner. Che effetto hanno le verifiche che coinvolgono questo metodo? ... Ripassare sulla documentazione il funzionamento del metodo hasNext ...
import java.util.Scanner;

public class BankAccountTester
{
  public static void main(String[] args)
  {
    Scanner in = new Scanner(System.in);
    BankAccount acct = new BankAccount();
    System.out.println("Creato un nuovo conto corrente");
    System.out.println("Numero di conto: " + acct.getAccountNumber());
    System.out.println("Saldo iniziale: " + acct.getBalance());

    boolean done = false;
    while (!done)
    {
        System.out.println("\n*********************************************");
        System.out.println("* Comando?");
        System.out.println("* Q per terminare\n* B per avere il saldo");
        System.out.println("* D  deposita una cifra");
        System.out.println("* W  preleva una cifra");
        System.out.println("* A  accredita interessi con tasso perc");
        System.out.println("*********************************************\n");

        String commLine = null;
        if (!in.hasNextLine()||(commLine=in.nextLine()).equalsIgnoreCase("Q"))
        {
            done = true;
            System.out.println("Arrivederci");
        }
        else
        {
            Scanner toks = new Scanner(commLine);
            if (toks.hasNext())
            {
                String cmd = toks.next();

                //visualizza il saldo
                if (cmd.equalsIgnoreCase("B") && !toks.hasNext() )
                    System.out.println("Saldo attuale: " + acct.getBalance());

                //effettua un versamento
                else if (cmd.equalsIgnoreCase("D") && toks.hasNext() ) 
                {  
                    try
                    {
                        double amount = Double.parseDouble(toks.next());
                        if(acct.deposit(amount))
                            System.out.println("Versamento OK: " + amount);
                        else
                            System.out.println("Versamento non corretto!");
                    }
                    catch (NumberFormatException e)
                    {  // non c'e' bisogno di fare niente, si torna
                        //ad una nuova iterazione del ciclo while
                    }
                }

                //effettua un prelievo
                else if (cmd.equalsIgnoreCase("W") && toks.hasNext() )
                {
                    try
                    {
                        double amount = Double.parseDouble(toks.next());
                        if(acct.withdraw(amount))
                            System.out.println("Prelievo OK: " + amount);
                        else
                            System.out.println("Prelievo non corretto!");
                    }
                    catch (NumberFormatException e){}		    
                }

                //calcola ed accredita interessi
                else if (cmd.equalsIgnoreCase("A") && toks.hasNext() )
                {
                    try
                    {
                        double perc = Double.parseDouble(toks.next());
                        double amount = perc / 100 * acct.getBalance();
                        if(acct.deposit(amount))
                            System.out.println("Interessei OK: " + amount);
                        else
                            System.out.println("Interessi non corretti!");
                    }
                    catch (NumberFormatException e){}
                }
            }  // fine del corpo dell'if (toks.hasNext())
        }  // fine del corpo dell'else
    }  // fine del ciclo while
  } // fine del corpo del metodo main
} // fine del corpo della classe