Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java软件设计-循环、对象创建与修改变量。内存、性能和;可靠性比较_Java_Arrays_Performance_Oop_Object - Fatal编程技术网

Java软件设计-循环、对象创建与修改变量。内存、性能和;可靠性比较

Java软件设计-循环、对象创建与修改变量。内存、性能和;可靠性比较,java,arrays,performance,oop,object,Java,Arrays,Performance,Oop,Object,假设我们正试图用java构建一个文档扫描程序类,该类接受1个输入参数,即日志路径(例如C:\document\text1.txt)。基于性能/内存/模块化,您更喜欢以下哪种实现 ArrayList<String> fileListArray = new ArrayList<String>(); fileListArray.add("C:\\document\\text1.txt"); fileListArray.add("C:\\document\\text2.txt")

假设我们正试图用java构建一个文档扫描程序类,该类接受1个输入参数,即日志路径(例如C:\document\text1.txt)。基于性能/内存/模块化,您更喜欢以下哪种实现

ArrayList<String> fileListArray = new ArrayList<String>();
fileListArray.add("C:\\document\\text1.txt");
fileListArray.add("C:\\document\\text2.txt");
.
.
.



//Implementation A
for(int i =0, j = fileListArray.size(); i < j; i++){
    MyDocumentScanner ds = new MyDocumentScanner(fileListArray.get(i));
    ds.scanDocument(); 
    ds.resultOutput();

}

//Implementation B
MyDocumentScanner ds = new MyDocumentScanner();
for(int i=0, j=fileListArray.size(); i < j; i++){
    ds.setDocPath(fileListArray.get(i));
    ds.scanDocument(); 
    ds.resultOutput(); 
}
ArrayList filelistary=new ArrayList();
添加(“C:\\document\\text1.txt”);
添加(“C:\\document\\text2.txt”);
.
.
.
//实施A
对于(int i=0,j=filelistary.size();i

就个人而言,我更喜欢A,因为它是封装的,但由于创建了多个实例,它似乎占用了更多的内存。我很好奇这是否有答案,或者这是另一个“取决于情况/环境”的困境?

如果您不需要多个
DocumentScanner
实例共存,我认为在循环的每次迭代中创建新实例毫无意义。它只是为垃圾收集器创建工作,垃圾收集器必须释放每个实例


如果数组的长度很小,那么选择哪种实现就没有多大区别,但是对于大型数组,实现B在内存(GC尚未释放的实例更少)和CPU(GC的工作量更少)方面都更有效.

如果不需要多个
DocumentScanner
实例共存,我认为在循环的每次迭代中创建新实例没有任何意义。它只是为垃圾收集器创建工作,垃圾收集器必须释放每个实例


如果阵列的长度很小,那么选择哪种实现就没有多大区别,但是对于大型阵列,实现B在内存(GC尚未释放的实例更少)和CPU(GC的工作量更少)方面都更有效。

尽管这显然是基于观点的,我将试着回答我的意见

你接近A会更好。您的文档扫描仪显然可以处理文件。应该在构建时设置,并保存在实例字段中。所以每个方法都可以引用这个字段。此外,构造函数可以对文件引用进行一些检查(空检查、存在性检查等)

您的方法B有两个非常严重的缺点:

  • 构建文档扫描程序后,客户端可以轻松调用所有方法。如果之前未设置任何文件,则必须使用
    IllegalStateException
    处理该“非法状态”。因此,这种方法增加了该类的代码和复杂性

  • 客户端应该或可以执行一系列方法调用。在这样的系列中间,用另一个完全的文件来调用文件设置方法很容易,破坏了整个扫描设备。为了避免这种情况,setter(对于文件)应该记住是否已经设置了文件。这几乎会自动导致接近A


  • 关于对象的创建:现代JVM在创建对象方面确实非常快。通常,没有可测量的性能开销。处理时间(此处:扫描)通常要高得多。

    虽然这显然是基于观点的,但我会尝试回答以表达我的观点

    你接近A会更好。您的文档扫描仪显然可以处理文件。应该在构建时设置,并保存在实例字段中。所以每个方法都可以引用这个字段。此外,构造函数可以对文件引用进行一些检查(空检查、存在性检查等)

    您的方法B有两个非常严重的缺点:

  • 构建文档扫描程序后,客户端可以轻松调用所有方法。如果之前未设置任何文件,则必须使用
    IllegalStateException
    处理该“非法状态”。因此,这种方法增加了该类的代码和复杂性

  • 客户端应该或可以执行一系列方法调用。在这样的系列中间,用另一个完全的文件来调用文件设置方法很容易,破坏了整个扫描设备。为了避免这种情况,setter(对于文件)应该记住是否已经设置了文件。这几乎会自动导致接近A


  • 关于对象的创建:现代JVM在创建对象方面确实非常快。通常,没有可测量的性能开销。处理时间(这里是扫描)通常要高得多。

    您是在实现
    DocumentScanner
    还是使用现有的类

    如果是后者,并且它是为能够分析一行中的多个文档而设计的,那么您可以像在变体B中一样重用该对象

    但是,如果您正在设计
    DocumentScanner
    ,我建议将其设计为处理单个文档,甚至没有
    setDocPath
    方法。这将导致该类中的可变状态减少,从而使其设计更加容易。同时,使用类的实例会减少出错的可能性


    至于性能,除非实例化
    DocumentScanner
    做了大量工作(比如实例化许多其他对象),否则不会有可测量的差异。在Java中实例化和释放对象是非常便宜的,如果由于分代垃圾回收器的存在,这些对象只在短时间内使用。

    您是在实现
    DocumentScanner
    还是使用现有的类

    如果是后者,并且它是为能够分析一行中的多个文档而设计的,那么您可以像在变体B中一样重用该对象

    H