构造函数能否在java中具有bufferedReader对象 在C++中,可能有一个默认流,如 class c { public: c(istream fin =cin):fin(fin){} }

构造函数能否在java中具有bufferedReader对象 在C++中,可能有一个默认流,如 class c { public: c(istream fin =cin):fin(fin){} },java,constructor,bufferedreader,Java,Constructor,Bufferedreader,类似地,我可以用java来做这件事,或者这是一种错误的做法,或者有更好的方法来做这件事吗?我想在从控制台读取和从文件读取之间进行选择 class c { c() { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); } c(int i) { FileReader f=new FileReader(path); BufferedReader br=new

类似地,我可以用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);

    }
}

您当然可以在Java中这样做。您可能需要对可能引发的IOException进行一些处理。但是,更好的方法可能是定义一个采用
读取器的构造函数,这样您就可以使用任何数据源实例化实例:

class C {
    C(Reader rdr) {
        BufferedReader br = new BufferedReader(rdr);
    }
}
(顺便说一句,Java编码惯例是类名以大写字母开头。)

是的,它们可以

然而,我认为大多数人会建议在构造函数中尽可能少做。(我怀疑很多人也会认为构造函数不应该失败,可能除了错误的输入)。构造函数不一定是使用者。例如,请查看该工具的工作原理。此外,该界面还可以方便地帮助管理资源

快乐编码

我还想知道这是否是一个好的软件工程实践,因为我在尝试查找bufferedreader对象时,并没有看到它在构造函数中被大量使用

我想说,从根本上将解析和构造的“关注点”加入到API中是不好的设计。如果该类为通用类,则这一点尤为重要;i、 e.可能在不同环境中使用/重复使用的

但是,如果这种构造函数对于执行构造和解析任务的其他更基本的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);
}

更新后的示例如下:


硬接线
系统中的
或类中的文件名是糟糕的设计。这使得代码过于死板。从其他地方读取数据的简单配置更改将导致代码更改。。。而且可能是代码搜索来查找所有其他路径的地方,等等。我不确定在C++ 1中是可能的。我在想怎么说。你说得一针见血。非常感谢……我也想知道这是否是一个好的软件工程实践,因为当我试图查找bufferedreader对象时,我没有看到它在构造函数中被大量使用。如果你建议从构造函数调用一个方法,应该指出的是,调用可以在子类中重写的方法是危险的。请参见[此处](}以获取有关这可能导致的问题的简单解释。