构造函数可以在java中使用bufferedReader对象

时间:2011-09-07 22:25:48

标签: java constructor bufferedreader

在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);

    }
}

3 个答案:

答案 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>