为何Java中Readable接口的read()方法未显式调用却能正常执行?
底层原理说明
- 首先,
CharGeneratorAdapter实现的Readable是Java标准库定义的统一字符源接口,该接口仅约定了一个核心方法read(CharBuffer cb),作用是让字符源的实现类自定义数据生成逻辑,供上层读取工具调用。 - 你在初始化
Scanner时传入了CharGeneratorAdapter实例,Scanner的构造器原生支持接收Readable类型作为输入源,内部会持有该实例的引用。 - 你调用的
x.hasNext()、x.nextLine()等Scanner方法本身不存储输入数据,当内部缓冲区没有可解析的内容时,Scanner会自动调用持有的Readable实例的read()方法,拉取新的字符数据填充到缓冲区后再完成解析逻辑。你没有显式调用read()方法,但Scanner的内部逻辑帮你完成了调用,这是Java标准库基于接口解耦的典型设计,属于策略模式的应用:你只需要自定义数据生成逻辑,不需要关心Scanner的解析流程,只要符合Readable接口约定的实现类都可以作为Scanner的输入源。 - 你代码中的
read()方法返回-1时,Scanner会判定输入源已经耗尽,此时hasNext()会返回false,循环终止。
内容的提问来源于stack exchange,提问作者Mr_t
相关产品推荐
相关产品推荐

