Java可以只在main方法中输入/输出吗?

时间:2018-04-18 04:44:29

标签: java

我是Java编程的新手。 最近我正在做Java任务。 我在用户定义的类

中缝制了这个方法
public void intputRank( Scanner s) {
    salary = s.nextInt();
}

我很困惑,因为我总是希望将I / O放在main方法中(就像在C ++中我只在主函数中编写cin cout)。我有两个理由这样做:

  1. 我很容易看到我的程序接受input的位置。当I / O出现问题时,我只需要调试main方法。
  2. 扫描程序是一个更复杂的Class,使用它作为参数会导致未知错误。
  3. 那么,Stack Overflowers,它只是一个坏的例子,或者我错误地理解了什么?

    如果是后者?为什么不

    public void inputRank( int asalary) {
        salary = asalary;
    }
    
    //in main method
    
    Scanner reader = new Scanner(System.in);
    int asalary = reader.nextInt();
    
    //then pass the asalary as parameter
    

2 个答案:

答案 0 :(得分:2)

如果您的计划需要强大,例如当提示输入一个整数时,它将验证输入并重新提示是否错误,然后使用可重复使用的辅助方法是一件好事。

这意味着您需要多个使用Scanner的方法。现在,您可以将Scanner对象作为参数传递,或者您可以将其放在一个字段中,这完全取决于您。

但重点是在使用Scanner的方法中使用代码是完全正常的,并且它确实是强大代码必须的,否则你将毁掉DRY(Don' t重复自己)原则。

示例:

public static int promptNonNegativeInt(Scanner sc, String prompt) {
    for (;;) {
        System.out.print(prompt + ": ");
        if (! sc.hasNextInt()) {
            System.out.println("** Not a valid number, please try again");
            sc.nextLine(); // discard bad input
            continue;
        }
        int value = sc.nextInt();
        sc.nextLine(); // discard any extra text on the line
        if (value < 0) {
            System.out.println("** Number cannot be negative, please try again");
            continue;
        }
        return value;
    }
}

使用示例

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int value = promptNonNegativeInt(sc, "Enter number");
    System.out.println("You entered: " + value);
}

如果您需要提示具有多个字段的对象,则更复杂。隔离执行此操作的代码是良好的编程(关注点分离),因此编写promptMyObject(Scanner sc)方法是一件好事。

特别是如果您需要提示各种对象。如果您将所有提示代码保留在main()方法中,那么它将是巨大且无法读取的。它将是God methodGod object的变体:

  

上帝对象是知道太多做得太多的对象。上帝对象是anti-pattern的一个例子。

答案 1 :(得分:0)

一般来说,我更喜欢编写在更复杂的类型上采用更简单类型的方法。这使得以后更容易编写和重用。

在您的示例中,采用int的方法可能比考虑Scanner更好,因为intScanner更简单,更常见。话虽如此,名称inputRank意味着它正在读取/接收输入,所以我很想在这种情况下将其重命名为applyRank