如何将一个实例方法中的扫描器类输入移动到另一个实例方法

时间:2015-10-26 21:43:19

标签: java java.util.scanner

我希望能够在一个实例方法中从scanner类中获取输入,然后将其传递给我将显示它的另一个实例方法。

这是我的问题的一个例子

    import java.io.*;
    import java.util.*;

    class TestScanner
    {
       public static void main (String args[])
       {
          TestScanner disInput = new TestScanner();
          TestScanner gInput = new TestScanner();
          gInput.grabInput();
          disInput.displayInput();


       }

       void displayInput()
       {
          System.out.println("Scanner Input here: ");
          System.out.println("What is my age: ");
          // How do I get age here
          System.out.println("What is 2 +2: ");
          // How do I get math here
       }

       void grabInput()
       {
         int age, math;
         Scanner stdin = new Scanner(System.in);

         System.out.println("What is my age: ");
         age = stdin.nextInt();
         System.out.println("What is 2 +2: ");
         math = stdin.nextInt();

       }
    }

3 个答案:

答案 0 :(得分:0)

BAD 避免学习解决方案:将agemath个本地变量移动到班级中的static字段。

该课程将如下所示:

public class TestScanner {
    static int age;
    static int math;
    //rest of your class...
    //in method grabInput
    static void grabInput() {
        //comment the variables
        //int age, math;
    }
}

由于static字段的使用,上述代码将有效。首先要了解what static meansbe careful when using it

您应该问自己以下问题:

  • 我应该有一种方法在同一个班级中显示TestScanner的字段吗?
  • 我应该创建TestScanner的新实例,只是为了显示另一个TestScanner实例的值吗?

如果您对这两个问题的回答都是肯定的,那么您可以创建一个接收TestScanner实例并打印其内容的方法。这就是你的课程的样子:

public class TestScanner {
    //Note: they're not static anymore (yay!)
    int age;
    int math;

    public static void main (String args[]) {
        TestScanner disInput = new TestScanner();
        TestScanner gInput = new TestScanner();
        gInput.grabInput();
        //note that now we need to pass the instance of TestScanner
        //in order to print its contents
        disInput.displayInput(gInput);
    }

    //method for display purposes
    void displayInput(TestScanner testScanner) {
        System.out.println("Scanner Input here: ");
        System.out.println("What is my age: ");
        System.out.println(testScanner.age);
        System.out.println("What is 2 +2: ");
        System.out.println(testScanner.math);
    }

    void grabInput() {
        Scanner stdin = new Scanner(System.in);
        System.out.println("What is my age: ");
        this.age = stdin.nextInt();
        System.out.println("What is 2 +2: ");
        this.math = stdin.nextInt();
    }
}

现在问问自己:我需要这一切吗?这是一个很好的设计吗?我可以轻松地执行更改,还是需要花费更多时间和精力,例如,添加新变量,填充并显示它?

此处的主要问题称为cohesion。这就是一个类中的功能程度。如您所见,TestScanner本身有很多责任:

  • 存储agemath
  • 从用户输入中读取
  • 向用户显示数据

更好的方法是将这些功能分为两类:

  1. Person(或其他名称)将存储来自用户输入的数据。根据{{​​1}}和age字段的名称,我认为该类的正确名称可以是math。该课程负责存储数据并为不同用途提供数据,例如存储用户输入,然后将其用于显示目的。
  2. 一个Person课程,您将在其中测试TestScanner的使用情况,以便从用户输入中读取数据并向用户显示数据。
  3. 设计将如下所示:

    Scanner

    注意:问题中提供的链接不用于装饰目的。

答案 1 :(得分:0)

您只需要一台扫描仪即可获得输入,完成后需要关闭扫描仪:

int grabInput(String question)
{
    // Display a question to user
    System.out.println(question);

    // Read a response from user
    Scanner stdin = new Scanner(System.in);
    int input = stdin.nextInt();
    stdin.close();

    // Return the response
    return input;
}

根本不需要任何扫描仪来显示输出:

int displayOutput(String message, int response)
{
    System.out.println(message);
    System.out.println(response);
}

以下是您对这些更改的主要看法:

public static void main (String args[])
{
    String ageQuestion = "What is my age?";
    int ageAnswer = grabInput(ageQuestion);

    String mathQuestion = "What is 2 + 2?";
    int mathAnswer = grabInput(mathQuestion);

    displayOutput(ageQuestion, ageAnswer);
    displayOutput(mathQuestion, mathAnswer);
}

诀窍是将响应返回给main,因为你需要在另一个函数中访问它们,并将Scanner逻辑埋在一个函数中,这样你就不用担心它了。

答案 2 :(得分:-1)

您可以在TestScanner类中创建一个静态变量,并且您的类的每个实例都可以访问该变量。请注意,变量对于每个类的实例都具有相同的值。

import java.io.*;
import java.util.*;

class TestScanner
{
   public static Integer age;
   public static Integer math;
   public static void main (String args[])
   {
      TestScanner disInput = new TestScanner();
      TestScanner gInput = new TestScanner();
      gInput.grabInput();
      disInput.displayInput();


   }

   void displayInput()
   {
      System.out.println("Scanner Input here: ");
      System.out.println("What is my age: ");
      // How do I get age here
      System.out.pritln(age);
      System.out.println("What is 2 +2: ");
      // How do I get math here
      System.out.pritln(math);
   }

   void grabInput()
   {
     Scanner stdin = new Scanner(System.in);

     System.out.println("What is my age: ");
     age = stdin.nextInt();
     System.out.println("What is 2 +2: ");
     math = stdin.nextInt();

   }
}

您可以查看java here中的静态变量。