Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Scanner对象作为构造函数参数传递给UserInterface类_Java_Oop_Java.util.scanner - Fatal编程技术网

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

Java 将Scanner对象作为构造函数参数传递给UserInterface类,java,oop,java.util.scanner,Java,Oop,Java.util.scanner,当我在观看一段关于如何将UserInterface与程序逻辑分离的youtube视频时,视频中的家伙将scanner类对象作为参数从main方法传递给UserInterface类的构造函数。像这样: public class UserInterface { TodoList list; Scanner input; UserInterface(TodoList list,Scanner input){ this.list=list; this.input=input;

当我在观看一段关于如何将UserInterface与程序逻辑分离的youtube视频时,视频中的家伙将scanner类对象作为参数从main方法传递给UserInterface类的构造函数。像这样:

public class UserInterface {
TodoList list;
Scanner input;

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

我的问题是,他为什么不在UserInterface类中创建一个Scanner类对象,而不是将Scanner对象作为主类的参数传递。

,因为Scanner是一个资源。这是一个非常奇怪的资源通常资源用于一个稍纵即逝的资源(如中所述,其思想是在应用程序完全退出之前就停止需要该资源),以及整个类中的一个资源(如中所述,您可以打开1个文件或100万个文件。概念“文件”是大量的;您可以有许多文件)。System.in很奇怪;你不想关闭它,而且只有一个

这使它成为一个奇怪的资源

然而,它是一个整体,资源最好作为单一实体来对待。您不希望同时创建两个单独的文件读取器。出于同样的原因,您不需要2台扫描仪。扫描器可以(而且确实!)缓存,所以如果你在一个扫描器上调用,比如说,
.hasNextInt()
,然后在另一个扫描器上调用
.next()
,事情就会变得很奇怪,因为扫描器并不是设计用来这样做的

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

另外,这也打开了允许
UserInterface
类对不同输入进行操作的大门。也许有一天,你想从一个互联网连接中获取输入,或者从一个包含一系列命令的批处理文件中获取输入。或者,更简单的是,您想要编写一个自动化测试

Scanner
并不意味着“来自标准输入”。你可以用很多东西做一个扫描仪:文件,网络连接,硬编码字符串,任何你想要的东西,真的