我是Java编程的新手。 最近我正在做Java任务。 我在用户定义的类
中缝制了这个方法public void intputRank( Scanner s) {
salary = s.nextInt();
}
我很困惑,因为我总是希望将I / O放在main
方法中(就像在C ++中我只在主函数中编写cin
cout
)。我有两个理由这样做:
input
的位置。当I / O出现问题时,我只需要调试main
方法。Class
,使用它作为参数会导致未知错误。那么,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
答案 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 method,God object的变体:
上帝对象是知道太多或做得太多的对象。上帝对象是anti-pattern的一个例子。
答案 1 :(得分:0)
一般来说,我更喜欢编写在更复杂的类型上采用更简单类型的方法。这使得以后更容易编写和重用。
在您的示例中,采用int
的方法可能比考虑Scanner
更好,因为int
比Scanner
更简单,更常见。话虽如此,名称inputRank
意味着它正在读取/接收输入,所以我很想在这种情况下将其重命名为applyRank
。