繁体   English   中英

有什么办法可以在不同的类中使用 Scanner 对象吗?

[英]Is there any way I can use a Scanner object in a different class?

所以我有一个简单的 Scanner 对象:

Scanner scan = new Scanner (System.in);

我试图在我在另一个类中声明的方法中使用这个 Scanner 对象。 无论如何这可以做到吗? 我也尝试过使用:

public static final Scanner scan = new Scanner(System.in);

但这并没有真正帮助

public static final Scanner scan = new Scanner(System.in);

正如您已将Scanner实例声明为publicstatic 因此,您可以使用类引用来访问它。

其他类中的代码。

String intpu = ClassName.scan.next();

ClassName是定义它的类的名称。

可能还有其他方法可以实现这一点:

  1. 将其传递给您要使用它的其他类的方法。

  2. 如果将Scanner实例定义为类的成员,则创建类的实例并使用 getter 方法访问它。

  3. 您可以在其他类中创建Scanner的新实例。

解决这个问题的常见设计模式是依赖注入。 依赖注入的一种形式称为构造函数注入。 为此,创建一个接受类所依赖的对象的构造函数。 然后当你实例化那个类时,你传入你希望它操作的对象(在你的例子中是你的扫描仪)。

例子

Main - 调用者类:

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        AnotherReader anotherReader = new AnotherReader(scan);
        anotherReader.readSomething();
    }
}

AnotherReader - 需要Scanner依赖的类:

public class AnotherReader {           

    Scanner scan;                      

    public AnotherReader(Scanner scan) 
        this.scan = scan;              
    }                                  

    public void readSomething(){       
        String line = scan.nextLine(); 
        // Do something                

    }                                  
}                                      

您可以在调用中将 Scanner 对象的引用传递给该方法。 method(Scanner sc)

您可以尝试inheritance :超类:

public class superclass
{
     Scanner scan=new Scanner(System.in); 
     //scanner object declared globally
     //constructor
     //other methods etc.
}

子类:

public class subclass extends superclass
{
//the scanner object can be inherited
}

使用继承,子类可以继承超类中的扫描仪对象。 我希望这有效。如果出现问题,请告诉我。

也可以在没有继承的情况下完成(不扩展):

  • 只需在相关的子类方法中创建超类的对象,如下所示:

     superclass ob=new superclass(); //created superclass object String takeIN= ob.scan.next(); /*refers to scanner object in superclass because scanner object is declared a field(global object) in superclass.*/
  • 按照你的例子,如果超类中的扫描仪对象是静态的,你可以像这样简单地使用它:

     Scanner takeIn=superclass.scan.next();

我解决这个问题的方法是在我调用的需要使用Scanner的类的方法中添加一个Scanner参数,然后在调用该方法时将scanner变量作为参数传递。

我的主要方法:

import java.util.Scanner;

public class ScannerTest
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        CalledClass cC = new CalledClass();

        cC.testMethod(input);
    }
}

调用类.java:

import java.util.Scanner;

public class CalledClass
{
    public void testMethod(Scanner x)
    {
        System.out.println("Enter anything");
        String myString = x.next();
        System.out.println(myString);
    }

}

这不是最漂亮的东西,但它确实有效。

这是我的操作方法:

  1. 在新包中创建 MyScanner.java(在本例中为:mypackage)

     package mypackage; import java.util.Scanner; public class MyScanner { static Scanner scan = new Scanner(System.in); public static String scan() { return scan.next(); } public static String scanLine() { return scan.nextLine(); } public static int scanInt() { return scan.nextInt(); } }
  2. 通过(静态)从 mypackage 的 MyScanner 类导入所有方法,在任何地方使用它。

     package yourpackage; import static mypackage.MyScanner.*; public class Main { public static void main(String[] args) { System.out.print("put an integer: "); int a = scanInt(); System.out.println("int a = " + a); } }

如果您不想使用静态导入,请更改import static mypackage.MyScanner.*; 在 MyScanner.java 中import mypackage.MyScanner; . 通过这样做,您不能再直接调用您的扫描器方法,您需要指定包含这些方法的类。 例如: MyScanner.scanInt()MyScanner.scan()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM