这个糟糕的节目吗?扫描仪作为全局变量

时间:2014-01-18 00:50:34

标签: java global-variables java.util.scanner

将输入扫描程序(如键盘)声明为类的全局变量是否被认为是错误的编程习惯?如:

private static Scanner input  = new Scanner(System.in);

我正在处理来自各种方法的大量输入,并且似乎很容易将键盘发送到每个方法

4 个答案:

答案 0 :(得分:6)

使用全局变量似乎要容易得多,但从长远来看,它可能会使代码难以维护,您是否考虑过创建一个类来处理键盘输入?通过良好的关注点分离,您可以获得更清晰的代码。

https://en.wikipedia.org/wiki/Separation_of_concerns

答案 1 :(得分:4)

最好是为创建输入和/或生成输出创建一个特殊类 例如

class IO{
Scanner scanner ;
public Scanner getScanner(){

return new Scanner();
}
public Scanner getScanner(File file){
return new Scanner(new FileReader(file));
}
... // other types of scanners
}

答案 2 :(得分:1)

取决于应该如何使用对象将定义放置它的位置。

如果Scanner只有一个实例,那么请考虑将其设为单例,而不是使用构造函数创建它。以下链接描述了单身人士:

http://www.javaworld.com/article/2073352/core-java/simply-singleton.html

然后,Scanner类可以使用名为“getInstance”的公共静态方法,而不是将其作为静态全局。因此,您不是将扫描仪的实例绑定到任何特定位置,并且无论何时需要使用它,都可以从任何地方调用Scanner.getInstance来访问该类的基础实例。

答案 3 :(得分:1)

总的来说,这是好的,因为它是您应用程序中非常常用的对象。但是,据我所知,你可以面对两个问题:

  • 扫描程序的并发访问和可变状态可能是个问题。您可能想要同步它。
  • 单元测试可能是一个问题,因为您无法覆盖静态成员。如果在使用它的类中可以覆盖它可能仍然可以。

因此,它取决于您的应用程序的大小以及它在多线程方面的使用方式。我会在家里做但不在工作。