Java 在何处关闭类中多次使用的扫描仪

Java 在何处关闭类中多次使用的扫描仪,java,methods,input,java.util.scanner,Java,Methods,Input,Java.util.scanner,因为我知道尽可能减少代码重复是更好的做法,所以我决定在整个类中只声明一个扫描器,但是我应该在哪里关闭扫描器对象,或者不一定要关闭它,关闭扫描器做什么呢 private Scanner scanner; /** * Constructor for objects of class Scanner */ public Ssss() { // initialise instance variables scanner = new Scanner(System.in); } p

因为我知道尽可能减少代码重复是更好的做法,所以我决定在整个类中只声明一个扫描器,但是我应该在哪里关闭扫描器对象,或者不一定要关闭它,关闭扫描器做什么呢

  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);
}

假设此代码位于类
Ssss
(如图所示)中,请考虑:

  • 您的类包含并使用
    扫描器
    对象,因此它负责关闭它
  • 扫描器
    表示内部资源和类的状态。。。不同的方法会在不同的时间引用它
  • 您无法知道您的类(主程序?)的用户何时使用它,因此您无法单方面关闭
    扫描仪
    ——您将在何处关闭它
  • 解决方案是您的类
    Ssss
    必须提供自己的方法,允许代码使用
    Ssss
    说“我受够你了”。此方法传统上称为
    close()
    ,在该方法中,您可以关闭扫描仪(并清理任何其他资源)

    客户端(调用类)必须在try-finally块中包装类
    Ssss
    的用法,并在
    finally
    子句中调用
    close()
    方法


    如果您使用的是Java7,您的类
    sss
    应该实现
    AutoCloseable
    ,这样就可以在try-with-resources语句中使用它来利用Java7的特性。

    在哪里调用
    输入***
    方法?(请提供一些调用这些方法的代码)。输入完成后,扫描器应该关闭。我不打电话给他们,因为我使用的是bluej,我们是手动操作的。这是一个很好的问题,揭示了OO设计的一些微妙而深刻的原则:封装和组合,并将责任放在它应该承担的地方。