Java ';继承';功能参数
我认为这是一种语言不可知论,但我想知道这个特性在Java中是如何工作的 假设我有一个函数,可以使用扫描仪读取文件:Java ';继承';功能参数,java,language-agnostic,Java,Language Agnostic,我认为这是一种语言不可知论,但我想知道这个特性在Java中是如何工作的 假设我有一个函数,可以使用扫描仪读取文件: void打印文件(扫描仪){ 而(s.hasNextLine()){ 字符串行=s.nextLine(); 系统输出打印项次(行); } } 所以,如果我有几种方法来模拟一个文件,那么使用这个函数 String content=“foo\nbar\n”; 打印文件(新扫描仪(内容)); File File=新文件(“my/File.txt”); 打印文件(新扫描仪(文件)); I
void打印文件(扫描仪){
而(s.hasNextLine()){
字符串行=s.nextLine();
系统输出打印项次(行);
}
}
所以,如果我有几种方法来模拟一个文件,那么使用这个函数
String content=“foo\nbar\n”;
打印文件(新扫描仪(内容));
File File=新文件(“my/File.txt”);
打印文件(新扫描仪(文件));
InputStream输入=新URL(“http://www.somewebsite.com/a.txt)。openStream();
打印文件(新扫描仪(输入));
我的问题是,如果我有几种方法来模拟这个文件,我如何使这个函数更容易使用,而不必每次调用它时都输入newscanner()
一些意见:
- 这在两个方面都很有用:易于编写单元测试和简化用户的API
- 重载函数可以解决问题,但是如果原始函数有多个重载,这可能会使代码变得丑陋和/或使编写代码变得复杂,开发人员必须阅读文档,编写相应的重载并重复
new
是个问题。调用new
并创建一个对象允许调用者具体说明调用者希望传入的内容。如果将函数签名更改为某个printFile(Object o)
,则可能无法保证调用Scanner
的结果。我认为这是样板代码。此外,调用printFile(file)
比调用printFile(new Scanner(file))
更有意义。您必须为要接受的每种类型创建一个重载:void printFile(URL URL)
,以及void printFile(file文件)
。这些将分别委托给void printFile(Scanner)
方法。为了避免重载,您需要创建一个适配器包装器对象,这基本上就是Scanner
在您的案例中的作用。