“继承”函数参数

'Inheriting' function parameters

提问人:desmond_jones 提问时间:3/14/2020 更新时间:3/14/2020 访问量:43

问:

我认为这有点与语言无关,但我想知道这个功能在 Java 中是如何工作的。

假设我有一个使用 Scanner 读取文件的函数:

void printFile(Scanner s) {
    while (s.hasNextLine()) {
        String line = s.nextLine();
        System.out.println(line);
    }
}

因此,如果我有几种方法来模拟文件,那么使用此功能将是

String content = "foo\nbar\n";
printFile(new Scanner(content));

File file = new File("my/file.txt");
printFile(new Scanner(file));

InputStream input = new URL("http://www.somewebsite.com/a.txt").openStream();
printFile(new Scanner(input));

我的问题是,如果我有几种方法可以模拟这个文件,我如何使这个函数更容易使用,而不必在每次调用它时都输入?new Scanner()

一些观察:

  • 这在两个方面很有用:轻松编写单元测试和为用户简化 API。

  • 重载函数可以解决问题,但是,如果原始函数有多个重载,这可能会使代码变得丑陋和/或使编写代码变得复杂,开发人员必须阅读文档,编写相应的重载并重复。

与 Java 语言无关

评论

2赞 markspace 3/14/2020
我不明白为什么打电话是个问题。调用和创建对象允许调用方具体说明调用方想要传入的内容。如果将函数签名更改为某些内容,则可能无法保证调用的结果可能是什么。newnewprintFile(Object o)Scanner
0赞 desmond_jones 3/14/2020
我认为这是样板代码。此外,调用比 更有意义。printFile(file)printFile(new Scanner(file))
0赞 Vince 3/14/2020
您必须为要接受的每种类型创建一个重载:、 和 。这些将分别委托给该方法。为了避免重载,您需要创建一个适配器包装器对象,该对象本质上是在您的情况下所起作用的。void printFile(URL url)void printFile(File file)void printFile(Scanner)Scanner

答: 暂无答案