Java中BufferedReader应各方法单独实例化还是设为类属性?
结论
把读取控制台输入的BufferedReader定义为类的静态成员变量,在你当前的文本UI项目场景下是完全合理、且性价比最高的方案,既避免了重复创建流实例的冗余,也省掉了跨方法逐层传参的麻烦。
具体实现方式
你直接在类层面初始化全局唯一的实例即可,所有UI方法(loginUI/mainUI/searchUI等)都可以直接调用,不需要额外传参:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class ConsoleUI { // 全局唯一的输入流实例,定义为类级别的静态常量 private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws IOException { loginUI(); mainUI(); } private static void loginUI() throws IOException { System.out.println("请输入账号:"); String account = br.readLine(); // 注意方法名是readLine(),L大写,你之前的写法存在笔误 // 登录校验逻辑 } private static void mainUI() throws IOException { // 主菜单逻辑,内部直接调用其他UI方法即可 searchUI(); } private static void searchUI() throws IOException { System.out.println("请输入搜索关键词:"); String keyword = br.readLine(); // 搜索逻辑 } }
需要注意的两个细节
- 绝对不要在任意UI方法中调用
br.close():这个流包装的是JVM全局的标准输入流System.in,一旦关闭,后续所有读取控制台输入的操作都会抛异常,不需要手动释放这个资源,等程序退出时会自动回收。 - 如果后续需要做输入源切换(比如测试时从文件读取模拟输入,而不是读控制台),只需要修改
br初始化那一行的逻辑即可,所有业务UI方法的代码完全不需要改动,维护成本很低。
如果你后续项目规模扩大,要把不同UI模块拆到不同的类里,再考虑把输入逻辑抽成独立的单例工具类就行;当前所有UI逻辑都在同一个类里的情况下,直接定义为类变量完全够用,不需要过度设计。
内容的提问来源于stack exchange,提问作者Matt Falco
相关产品推荐
相关产品推荐

