Java静态或继承变量

UI *_* UX 5 java inheritance static

假设我有3个班级A,B,C和我的主班。B扩展了A。我要使用扫描仪,所有这些都包括我的主扫描仪。我应该通过继承移动扫描仪,还是应该使用static并在主扫描仪中声明扫描仪?

我试图看一下这里,但没有得到一个更好的明确答案: 有什么方法可以在其他类中使用Scanner对象?

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){

    }
Run Code Online (Sandbox Code Playgroud)

就像我上面说过的,我想了解哪种方法更好,并且是正确使用的方法。staticScanner并由我的主班级调用,或根据需要在班级之间移动Scanner sc

Tre*_*man 0

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

不过,一般来说,我个人更喜欢c.doSomething(sc);在方法调用之间 C 类中不保留任何内部状态。即我们没有c.doSomething1(sc),并且c.doSomething2(sc)由于内部状态在 中被修改,因此需要针对同一扫描仪调用该命令C

反驳的论点是,如果我们在扫描器周围创建一个有效的包装器(或某种形式的装饰器),那么将扫描器传递给构造函数中的类并保留对它的引用是非常有意义的。也就是说,如果我们想要这样的东西:

MyReader reader = new MyReader(scanner);
MyObject myObject = reader.readNextMyObject();
Run Code Online (Sandbox Code Playgroud)

但是,我认为如果我们通过代码中交错的多个包装器从同一扫描仪读取数据,将会非常混乱:

// 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();
Run Code Online (Sandbox Code Playgroud)

我认为两个不同的阅读器在同一扫描仪上操作并移动其索引会令人困惑。