在Java中使用Scanner作为全局变量是不是不好的做法?[已关闭]

vjhs03f7  于 2023-03-06  发布在  Java
关注(0)|答案(4)|浏览(398)
    • 已关闭**。此问题为opinion-based。当前不接受答案。
    • 想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

九年前就关门了。
Improve this question
将输入扫描器(如键盘)声明为类中的全局变量是否被认为是不良的编程实践?
例如:

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

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

jljoyd4f

jljoyd4f1#

最好创建一个特殊的类来获取输入和/或生成输出。
例如:

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

5t7ly7z52#

使用全局变量看起来容易得多,但从长远来看,它会使代码很难维护,你有没有想过创建一个类来处理键盘输入?通过良好的关注点分离,你最终会得到更干净的代码。
https://en.wikipedia.org/wiki/Separation_of_concerns

mkshixfv

mkshixfv3#

根据对象应该如何使用,将定义放置它的位置。
如果Scanner必须只有一个示例,那么考虑将其设置为单例,而不是使用构造函数创建它。以下链接描述了单例:
http://www.javaworld.com/article/2073352/core-java/simply-singleton.html
然后,Scanner类可以有一个名为'getInstance'的公共静态方法,而不是将其作为静态全局方法。因此,您不会将scanner的示例绑定到任何特定位置,并且无论何时需要使用它,都可以从任何位置调用Scanner.getInstance来访问该类的底层示例。

knsnq2tg

knsnq2tg4#

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

  • 扫描器的并发访问和可变状态可能是个问题。您可能需要同步它。
  • 单元测试可能是个问题,因为你不能覆盖静态成员。如果在使用它的类中它可以被覆盖,它可能还是可以的。

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

相关问题