Java软件设计-循环、对象创建与修改变量。内存、性能和;可靠性比较
假设我们正试图用java构建一个文档扫描程序类,该类接受1个输入参数,即日志路径(例如C:\document\text1.txt)。基于性能/内存/模块化,您更喜欢以下哪种实现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")
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
处理该“非法状态”。因此,这种方法增加了该类的代码和复杂性关于对象的创建:现代JVM在创建对象方面确实非常快。通常,没有可测量的性能开销。处理时间(此处:扫描)通常要高得多。虽然这显然是基于观点的,但我会尝试回答以表达我的观点 你接近A会更好。您的文档扫描仪显然可以处理文件。应该在构建时设置,并保存在实例字段中。所以每个方法都可以引用这个字段。此外,构造函数可以对文件引用进行一些检查(空检查、存在性检查等) 您的方法B有两个非常严重的缺点:
IllegalStateException
处理该“非法状态”。因此,这种方法增加了该类的代码和复杂性关于对象的创建:现代JVM在创建对象方面确实非常快。通常,没有可测量的性能开销。处理时间(这里是扫描)通常要高得多。您是在实现
DocumentScanner
还是使用现有的类
如果是后者,并且它是为能够分析一行中的多个文档而设计的,那么您可以像在变体B中一样重用该对象
但是,如果您正在设计DocumentScanner
,我建议将其设计为处理单个文档,甚至没有setDocPath
方法。这将导致该类中的可变状态减少,从而使其设计更加容易。同时,使用类的实例会减少出错的可能性
至于性能,除非实例化
DocumentScanner
做了大量工作(比如实例化许多其他对象),否则不会有可测量的差异。在Java中实例化和释放对象是非常便宜的,如果由于分代垃圾回收器的存在,这些对象只在短时间内使用。您是在实现DocumentScanner
还是使用现有的类
如果是后者,并且它是为能够分析一行中的多个文档而设计的,那么您可以像在变体B中一样重用该对象
H