You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:32:07