假设我们有一个方法可以删除ListView
中的所有项目,然后添加Label
以及用户指定的文本:( 标签用作示例,它可以通过任何对象)
示例A保留较小的变量范围,但在每个方法调用上创建一个新的Object:
public void populateListView() {
listView.getItems().clear();
Label label = new Label("some string from user");
listView.getItems().add(label);
}
示例B具有更宽的变量范围,但在类加载时仅创建一次Object。此外,不是创建新的Label
,而是使用相同的Label
引用。
public class MyClass{
private Label label = new Label();
public void populateListView() {
listView.getItems().clear();
label.setText("some string from user");
listView.getItems().add(label);
}
}
我们可以看到,在示例A中,第一行清除了listView
的所有对象引用。
这是否意味着,在新方法调用中,前一个方法调用中创建的Label
将被垃圾收集(以及有多快)?
换句话说,考虑到我们多次调用每个方法,示例B在内存分配方面会更有效吗?如果是的话,考虑'始终保持最小的范围'哪个例子应该被选择以及为什么?
答案 0 :(得分:2)
应避免过早优化,因为它会降低代码质量
此外,如果你有一个内存问题,很可能它是主要原因,因为Label
不是一个重物(对象本身,而不是它的渲染),你不会创建成千上万的方法。
因此,让垃圾收集器完成其工作并通过将变量范围缩小到严格要求(示例A)来保持清晰的代码。
如果稍后您在运行时遇到内存问题,请对应用程序进行概要分析(例如使用JVisualVM)来发现罪魁祸首(很可能不是这个)。