2013-10-25 3 views
5

Come so che è meglio avere meno duplicazioni possibili del codice, quindi ho deciso di dichiarare solo uno scanner per tutta la classe, ma dove devo chiudere l'oggetto dello scanner o non è necessariamente chiuderlo, cosa fa la chiusura dello scanner.dove chiudere lo scanner utilizzato più di una volta nella classe

private Scanner scanner; 
/** 
* Constructor for objects of class Scanner 
*/ 
public Ssss() 
{ 
    // initialise instance variables 
    scanner = new Scanner(System.in); 
} 
public void enterYourName() 
{ 
    System.out.println("Enter your Name"); 
    String name = scanner.nextLine(); 
    System.out.println("Your name is:" + name); 
} 
public void enterYourAge() 
{ 
    System.out.println("Enter your Age"); 
    int age = scanner.nextInt(); 
     System.out.println("Your age is: " + age); 
} 
+1

Dove chiamate i metodi 'enterYour ***'? (Si prega di fornire un codice per dove si chiama quei metodi). Quando gli input sono terminati, lo scanner dovrebbe essere chiuso. –

+0

Non li chiamo veramente perché sto usando bluej lo facciamo manualmente –

+0

Questa è una domanda eccellente e svela alcuni principi sottili e profondi del design OO: incapsulamento e composizione, e attribuendo responsabilità a chi appartiene. –

risposta

4

Assumendo questo codice è in una classe Ssss (come sembra), prendere in considerazione:

  1. La classe contiene e utilizza un oggetto Scanner, quindi è responsabile per la chiusura di esso.
  2. Il Scanner rappresenta una risorsa interna, e stato della classe ... diversi metodi faranno riferimento ad esso in momenti diversi.
  3. Non puoi sapere quando l'utente della tua classe (il programma principale?) Ha finito con esso, quindi non puoi chiudere unilateralmente il Scanner - dove lo chiuderesti?

La soluzione è che la classe Ssss deve fornire il proprio metodo che consente il codice utilizzando Ssss a dire "ho finito con te". Questo metodo è tradizionalmente chiamato close() e in esso si chiude lo Scanner (e si puliscono eventuali altre risorse).

Il client (classe chiamante) devono avvolgere l'utilizzo della classe Ssss in un try-finally e chiamare tuaclose() metodo nella clausola finally.

Se si utilizza Java7, la classe Ssss deve implementare AutoCloseable in modo che possa essere utilizzata in un'istruzione try-with-resources per sfruttare tale funzionalità Java7.