将Scanner对象作为构造函数参数传递给UserInterface类

时间:2020-10-17 12:16:20

标签: java oop java.util.scanner

当我观看有关如何将UserInterface与程序逻辑分开的youtube视频时,视频中的那个家伙通过main方法将Scanner类对象作为参数传递给UserInterface类的构造函数。像这样:

public class UserInterface {
TodoList list;
Scanner input;

UserInterface(TodoList list,Scanner input){
    this.list=list;
    
    this.input=input;
    
}
}

我的问题是,为什么他不在UserInterface类中创建Scanner类对象,而不是将Scanner对象作为参数传递给Main类呢?

1 个答案:

答案 0 :(得分:1)

因为扫描仪是一种资源。这是一个非常奇怪的资源。 通常资源用于短暂的资源(例如,想法是在应用程序完全退出之前就停止使用该资源),并且在整个类中使用一个资源(例如,您可以打开一个文件,或一百万。“文件”的概念是多种多样的;您可以有很多文件)。 System.in很奇怪;您不想关闭它,只有一个。

这使它成为一种奇怪的资源。

尽管如此,它是其中之一,最好将资源视为单个实体。您不想同时创建2个单独的文件读取器。出于同样的原因,您不需要2台扫描仪。扫描程序可以缓存(并且可以缓存!),因此,如果您在一个扫描仪上调用.hasNextInt(),然后在另一个扫描仪上调用.next(),事情就会变得很奇怪,因为扫描仪并非旨在这样做。

让我尝试这样说:System.in是一个全局常量。因此,使用System.in的任何扫描仪也应该使用,因为它被指定为可以缓存事物的事物。

另外,这也为您的UserInterface类在不同的输入上进行操作打开了方便之门。也许有一天,您想从Internet连接或其中包含一系列命令的批处理文件中获取输入。或者,甚至更简单地,您想编写一个自动化测试。

Scanner并非固有含义:“来自标准输入”。您可以使用许多东西制作扫描仪:文件,网络连接,硬编码字符串,任何您想要的东西。