在 Java 中使用 Scanner 作为全局变量是不良做法



将输入扫描程序(如键盘)声明为类中的全局变量是否被认为是糟糕的编程实践?
如:

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

我正在使用来自各种方法的大量输入,使用公共 var 似乎比必须将键盘发送到每个方法要容易得多。

最好创建一个

特殊的类来获取输入和/或生成输出.
例如:

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...
}

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

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

根据对象的使用方式,将定义放置它的位置。

如果扫描程序必须只有一个实例,请考虑将其设置为单例,而不是使用构造函数创建它。以下链接描述了单例:

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

然后,Scanner 类可以具有一个名为"getInstance"的公共静态方法,而不是将其作为静态全局。因此,您不会将扫描程序的实例绑定到任何特定位置,并且每当需要使用它时,请从任何位置调用 Scanner.getInstance 以访问类的基础实例。

总的来说,

没关系,因为它是应用程序中非常常用的对象。但是,据我所知,您可能会面临两个问题:

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

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

最新更新