Java静态变量或继承变量

5
假设我有三个类 A、B、C 和我的 Main。 B 扩展了 A。 我想在它们所有的类中(包括主类)使用扫描器。 我应该通过继承移动扫描器,还是应该使用静态并在我的 Main 中声明我的扫描器?
我尝试在这里查找答案,但没有得到明确的答案哪种方法更好: Is there any way I can use a Scanner object in a different class?
public class Main {
    public static Scanner staticScanner = new Scanner (System.in);
public static void main(String[] args) {
    Scanner sc = new Scanner (System.in);
    A a = new A(sc);
    C c = new C();
    c.cDoSomething(sc);
    sc.close();
    }

public class A {
    private Scanner sc;
    public A (Scanner sc){
    this.sc = sc;
    }
    public void aDoSomething(){
         B b = new B();
         b.bDoSomething(sc);

    }

public class B extends A {
    public void bDoSomething(Scanner sc){

    }

public class C {
    public void cDoSomething(Scanner sc){

    }

就如我之前所说,我想了解哪种方法更好、更正确。 是在我的主类中调用 staticScanner 还是根据需要在不同的类之间移动 Scanner sc?


我会将 new Scanner(System.in) 的使用限制在表示层/类中,因此可能会为其设计一个单例模式。或者您可以查看 Console 类,该类专门用于这些用例。 - Luiggi Mendoza
2个回答

0

我建议您避免使用可以从任何地方访问的全局静态变量。

我会将Scanner封装到一个自定义类中,我们称之为Reader,并将后者作为依赖项传递给需要读取的类。 Scanner类是一个非常简单和具体的东西,无法限制您的类。

我不会将ScannerReader作为方法参数传递。例如,父类A可以通过受保护的getter为其子类打开对字段的只读访问权限。


0

我认为这里的答案可能取决于底层类和情况的一些具体细节,特别是关于扫描仪状态与类中其他变量状态的耦合程度以及需要多少个单独的方法或调用。

然而,通常情况下,如果在类C的方法调用之间没有保留内部状态,我个人更喜欢c.doSomething(sc);。也就是说,由于在C中修改了内部状态,我们不需要按顺序调用c.doSomething1(sc)c.doSomething2(sc)来处理同一个扫描仪。

反对意见是,如果我们实际上正在Scanner周围创建包装器(或某种装饰器),将扫描仪传递到构造函数中并保留对其的引用是完全有道理的。也就是说,如果我们想要像下面这样的东西:

MyReader reader = new MyReader(scanner);
MyObject myObject = reader.readNextMyObject();

然而,如果我们通过多个包装器交错地从同一个扫描器中读取代码,这将非常令人困惑:

// I think the below would be UGLY, at least imho.
MyReaderA readerA = new MyReaderA(scanner);
MyReaderB readerB = new MyReaderB(scanner);
MyObjectX obj1 = readerA.readMyObject();
MyObjectY obj2 = readerB.readMyObject();

我认为让两个不同的读取器在同一个扫描仪上操作并移动其索引会很混乱。


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