Java中仅在main方法处理输入输出是否可行?新手技术问询
关于Java中Scanner传递与IO处理的疑惑解答
嘿,作为刚从C++转过来的Java新手,有这样的疑惑太正常啦——毕竟两种语言在IO处理的惯用思路上确实有差异😉
首先得给你点个赞:你习惯在main里集中处理输入输出的做法,完全是符合关注点分离的好实践!你的两个理由非常到位:
- 集中管理IO,能一眼找到程序接收输入的入口,代码逻辑更清晰;
- 一旦IO出问题,只需要调试
main方法就行,排查问题的范围大大缩小。
那为什么会出现public void intputRank(Scanner s) { salary = s.nextInt(); }这种写法呢?(顺便提一句,方法名应该是inputRank,你可能打错啦)
有些开发者会觉得,让自定义类自己负责读取数据来设置属性,更符合“面向对象”的封装思想——比如这个类管着salary,那让它自己读取设置值似乎更“自给自足”。但这种做法其实是有争议的:
- 它把业务逻辑和IO操作耦合在了一起,让类的职责变杂了——这个类本来应该只处理和自身属性相关的业务,现在还要操心输入的事儿;
- 测试起来会很麻烦:如果你想测试这个类的业务逻辑,没法直接给
salary赋值,必须模拟一个Scanner的输入,增加了测试成本。
针对你的情况,给你几个具体的建议:
- 继续坚持你的做法:在
main里用Scanner读取所有输入数据,然后调用自定义类的setter方法(比如setSalary(int salary))来设置属性。这样业务类只专注于自身的逻辑,不依赖IO,代码的可维护性和可测试性都会更高。 - 如果遇到别人写的这类代码:不用慌,它本质就是把
Scanner作为一个输入源传递给方法,让方法从这个源里读取数据。你可以考虑重构它,把IO和业务逻辑分开,改成你习惯的写法。 - 关于Scanner作为参数:它其实就是一个普通的对象参数,和传递其他类的对象没区别,只是它代表了一个输入流。但把它传到业务类里会让类和IO强绑定,所以一般不推荐这种写法。
举个简单的对比例子,更直观:
原来的写法(耦合IO)
public class Employee { private int salary; // 注意方法名拼写错误,应该是inputRank public void intputRank(Scanner s) { salary = s.nextInt(); } } // main方法调用 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Employee emp = new Employee(); emp.intputRank(scanner); }
推荐的写法(关注点分离)
public class Employee { private int salary; // 只负责设置属性,不处理IO public void setSalary(int salary) { this.salary = salary; } // 其他业务方法... } // main方法集中处理IO public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 在这里统一读取输入 int salaryInput = scanner.nextInt(); Employee emp = new Employee(); // 把读取到的值传给业务类 emp.setSalary(salaryInput); scanner.close(); }
总的来说,你的习惯是非常棒的,完全符合代码设计的最佳原则。那种把Scanner传给业务类的写法虽然能运行,但并不是最优解,坚持你的思路就好!
内容的提问来源于stack exchange,提问作者DoubleX
相关产品推荐
相关产品推荐

