在C ++中,可以使用像
这样的默认流class c
{
public:
c(istream fin =cin):fin(fin){}
}
我可以在java中这样做,或者这是错误的做法。或者有更好的方法吗?我想在从控制台读取和从文件中读取之间做出选择。
class c
{
c()
{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
}
c(int i)
{ FileReader f=new FileReader(path);
BufferedReader br=new BufferedReader(f);
}
}
答案 0 :(得分:3)
“是的,他们可以”。
但是,我认为大多数人会建议在构造函数中尽可能少地执行。 (我怀疑很多人也会认为一个构造函数不应该失败,除了输入错误之外)。构造函数不一定是消费者。例如,看看Scanner class的工作原理。此外,Closeable界面也可以帮助管理资源。
快乐的编码。
答案 1 :(得分:2)
你当然可以用Java做到这一点。您可能需要对可能抛出的IOExceptions执行某些操作。但是,更好的方法可能是定义一个带Reader
的构造函数,这样就可以使用任何数据源实例化一个实例:
class C {
C(Reader rdr) {
BufferedReader br = new BufferedReader(rdr);
}
}
(顺便说一句,Java编码约定是类名以大写字母开头。)
答案 2 :(得分:0)
我还想知道这是不是很好的软件工程实践,因为当我试图查找时,我没有看到构造函数中使用的bufferedreader对象
我想说,从根本上加入在API中解析和构建的“问题”并不是一个好的设计。如果课程是通用课程,这一点尤其重要;即可能在不同环境中使用/重用的一种。
但是,如果这样的构造函数对于执行构造和解析任务的其他更基础的API方法/构造函数来说真的是“方便的重载”,那么它就没有错:
public Foo(Reader reader) {
this();
this.load(reader);
}
public Foo() {
...
}
public void load(Reader reader) {
...
}
我会使用Reader
而不是BufferedReader
作为参数类型。某些用例不需要缓冲BufferedReader
,如果您的类使用BufferedReader
的有限解析功能,则不应在API方法中公开该实现细节。 。 所有的事情都是平等。 (但语用学可以另有规定。)
如果您需要在内部使用BufferedReader,并且您担心输出链中不必要的过滤器的(小)成本,请执行以下操作:
public void load(Reader reader) {
BufferedReader br = (reader instanceof BufferedReader) ?
(BufferedReader) reader : new BufferedReader(reader);
}
重新更新您的示例:
硬连线System.in
或类中的文件名是糟糕的设计。它使代码太不灵活。从其他地方读取数据的简单配置更改将导致代码更改...并且可能是代码搜索以查找路径等已经硬连接的所有其他位置。 / p>