在Java中,将Scanner用作全局变量是不良实践吗?

9

在一个类中将输入扫描器(例如键盘)声明为全局变量是否被认为是不好的编程实践?
比如:

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

我正在处理来自多种方法的大量输入,使用公共变量似乎比将键盘发送到每个方法更容易。


2
不,根据我的经验,这并不一定是不好的实践。 - Kon
3
由于那个东西不属于任何对象,所以这是糟糕的面向对象编程。 - zapl
2
这可能是使用单例模式的一个很好的案例。 - ajb
1
实用对象是大型Java程序中的必需品。将此对象作为某个实用类的静态成员是极其普遍的做法。可能不是理想的面向对象编程实践,但我认为并不<b>差</b>。 - Kon
1
如果你传递键盘,测试时模拟会更容易... - Mitch Wheat
1
一般来说,应该给变量分配最小的作用域。如果在许多地方使用扫描器,则可能没有问题。 - Bohemian
4个回答

7
最好为获取输入和/或生成输出创建一个特殊类。 例如:
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...
}

6

使用全局变量似乎更容易,但从长远来看,它会使代码难以维护。你有没有考虑过创建一个类来处理键盘输入?通过良好的关注点分离,你最终将得到更清晰的代码。

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


2
根据对象的使用方式来确定放置它的位置。
如果Scanner是必须只有一个实例的东西,那么考虑将其制作为单例而不是使用构造函数创建它。以下链接描述了单例模式:

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

然后,不要将其作为静态全局变量,Scanner类可以有一个名为“getInstance”的公共静态方法。因此,您不会将扫描仪实例绑定到任何特定位置,每当需要使用它时,只需从任何地方调用Scanner.getInstance来访问该类的基础实例即可。

1

总体来说,这是您应用程序中非常常见的对象,因此它还可以。但是,就我所看到的,有两个问题可能会影响您:

  • Scanner的并发访问和可变状态可能会成为问题。您可能需要同步。
  • 由于无法覆盖静态成员,因此单元测试可能会成为问题。如果在使用它的类中可以覆盖它,则可能仍然可以。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接