2013-10-25 1 views
5

できるだけコードの重複を少なくする方が良いことを知っているので、クラス全体で1つのスキャナを宣言することにしましたが、スキャナオブジェクトをどこで閉じるかまたはそれを必ず閉じるわけではありません、スキャナを閉じるのは何ですか。ここで、スキャナを閉じるクラスを複数回使用する

を検討し、(それが表示される)このコードは、クラス Ssssであると仮定すると、
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

あなたの 'enterYour *** 'メソッドはどこにありますか? (これらのメソッドを呼び出す場所のコードをいくつか提供してください)。入力が完了したら、スキャナを閉じます。 –

+0

私はbluejを使用しているので、実際に呼び出すことはありません。 –

+0

これは素晴らしい質問であり、オブジェクト指向設計のいくつかの微妙で深い原則を包括します。 –

答えて

4

  1. あなたのクラスが含まれているとScannerオブジェクトを使用していますので、それを閉じるための責任があります。
  2. Scannerは、内部リソース、およびのクラスの状態を表しています...異なるメソッドは、異なる時間にそれを参照します。
  3. あなたのクラス(メインプログラム?)のユーザーがいつ終了するのかわからないので、一方的に閉じることはできませんScanner - どこで終了しますか?

ソリューションは、あなたのクラスSsssは、「私はあなたと終わりだ」と言ってSsssを使用してコードを可能にする独自の方法を提供しなければならないということです。このメソッドは伝統的にclose()と呼ばれています。その中にスキャナを閉じます(そして他のリソースもクリーンアップします)。

クライアント(呼び出し元のクラスは)ブロック最終的にトライして、あなたのクラスSsssの使用をラップし、finally句にあなたclose()メソッドを呼び出す必要があります。

Java7を使用している場合、クラスSsssAutoCloseableを実装する必要があります。そのため、Java7機能を利用するためにtry-with-resourcesステートメントで使用できます。

関連する問題