【问题标题】:Java static or inheritance variableJava 静态或继承变量
【发布时间】:2019-08-07 19:00:03
【问题描述】:

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

我试图看这里,但没有得到更好的明确答案: 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 类。

标签: java inheritance static


【解决方案1】:

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

不过,一般来说,如果在方法调用之间没有在类 C 中保留内部状态,我个人更喜欢 c.doSomething(sc);。 IE。由于在C 中修改了内部状态,我们没有需要针对同一扫描仪调用的c.doSomething1(sc)c.doSomething2(sc)

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

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();

我认为如果两个不同的阅读器在同一个扫描仪上运行并移动它的索引,这会让人感到困惑。

【讨论】:

    【解决方案2】:

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

    我会将Scanner 包装到一个自定义类中,我们称之为Reader,并将后者作为需要读取的类的依赖项传入。 Scanner 类是一个非常简单且过于具体的东西,无法将你的类绑定到。

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

    【讨论】:

      猜你喜欢
      • 2019-04-28
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多