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

标签 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");
.
.
.



//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(); 
}

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

最佳答案

虽然这显然是基于意见的,但我会尝试一个答案来表达我的意见。

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

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

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

  2. 客户端似乎应该或可以执行一系列方法调用。在这样一个系列的中间,很容易使用完全不同的文件再次调用文件设置方法,从而破坏整个扫描设施。为了避免这种情况,您的 setter (文件)应该记住文件是否已经设置。这几乎自动导致方法 A。

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

关于Java 软件设计 - 循环、对象创建 VS 修改变量。内存、性能和可靠性比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28208753/

相关文章:

python - Python Testdome 的两次和测试 - 如何通过性能测试?

c# - 从高斯分布中抽取随机值的最快方法是什么?

java - Java集合栈数据结构的效率

Java API : Cross-site JSESSIONID is not maintained between requests

arrays - 创建一个类的所有对象的数组

arrays - Swift 数组类型现在使用多维数组的元素类型用括号括起来

arrays - 在 Ruby 中按索引从数组中删除多个元素

java - 覆盖java txt文件中的一行

java - @InjectLink 值中的问号被编码为 %3F。如何防止这种情况发生?

java - 固定序列排列