将输入扫描程序(如键盘)声明为类中的全局变量是否被认为是糟糕的编程实践?
如:
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 以访问类的基础实例。
没关系,因为它是应用程序中非常常用的对象。但是,据我所知,您可能会面临两个问题:
- 扫描程序的并发访问和可变状态可能是一个问题。您可能希望同步它。
- 单元测试可能是一个问题,因为无法重写静态成员。如果在使用它的类中可以覆盖它,它可能仍然可以 。
因此,这取决于应用的大小以及它在多线程方面的使用方式。我会在家里做,但不会在工作中做。