Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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/android/196.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_Android - Fatal编程技术网

Java:全局变量是否节省内存和/或时间?

Java:全局变量是否节省内存和/或时间?,java,android,Java,Android,我正在开发一个Android应用程序,我正在编写的一个方法可能会被多次调用。在这种方法中,我对用户界面进行更新。内存使用和性能对我很重要。在我看来,我有两个选择来更改UI 第一种是每次都创建新对象。也就是说: public void myMethod(){ new View().makeVisible(); } 第二种方法是将对象全局声明为变量,并在方法中引用它。这可能看起来像: View myView = new View(); public void myMethod(){ myView

我正在开发一个Android应用程序,我正在编写的一个方法可能会被多次调用。在这种方法中,我对用户界面进行更新。内存使用和性能对我很重要。在我看来,我有两个选择来更改UI

第一种是每次都创建新对象。也就是说:

public void myMethod(){
new View().makeVisible();
}
第二种方法是将对象全局声明为变量,并在方法中引用它。这可能看起来像:

View myView = new View();

public void myMethod(){
myView.makeVisible();
}

显然,如果这个方法只调用了几次,那么任何差异都将很小。但是,如果我可能多次调用此函数,并且有许多变量以这种方式被调用/或创建,那么第二种方式是否会提高性能?

全局变量更有效

创建新对象会占用更多内存,因为每次创建视图并替换旧视图时,旧视图都必须被垃圾回收。使用全局变量重用同一视图可以节省系统创建新对象和收集旧对象的任务

编辑:
全局变量只是对对象的引用,而不是对象本身。

好吧,当您让每个构造函数创建一个新实例时,实际上您是在再次执行并非绝对必要的工作。如果我站在你的立场,我会选择全局变量选项,然后清除视图,如果可能的话,在同一个对象上重新绘制。这防止了重复内存释放和使用其他方法分配的可能性,因此,除非您认为清除的代价特别高,以至于值得继续分配新视图,否则请删除它


重用同一对象的另一个动机是,java虚拟机实现在垃圾收集的使用上有所不同,因为一旦变量超出范围,当与JVM对应的内存被释放时,它就不能被访问。您可能会发现,在另一种情况下,许多视图是按顺序分配的,但在进程闲置一段时间之前,并非所有视图都被解除分配,这实际上使应用程序成为了一个内存占用器,与您不希望的完全一样。

正如其他答案所示,重用同一个对象而不是为每个方法调用重复实例化一个新对象将减少内存占用并提高垃圾收集的性能

但我会首先考虑可维护性。重用同一个对象是否会使代码更加复杂(并可能引入bug)?在编程时牢记效率是很好的,但要避免过早的优化,因为这会使项目复杂化并减慢开发速度

如果性能和内存使用是一个问题,那么是的,重用相同的
视图将使您受益匪浅:

final View myView = new View(); //made final because it shouldn't be reassigned
如果你真的想获得资源,你甚至可以懒散地加载对象——也就是说,只在需要的时候创建它。然而,我建议使用番石榴来处理这个问题,而不是手工编码:

final Supplier<View> myViewSupplier = Suppliers.memoize(new Supplier<View>() {
    @Override
    public View get() {
        return new View();
    }
});

...

public void myMethod() {
    View myView = myViewSupplier.get(); //lazy-loads when first called
    myView.makeVisible();
}
final Supplier myViewSupplier=Suppliers.memoize(新供应商(){
@凌驾
公共视图获取(){
返回新视图();
}
});
...
公共方法(){
View myView=myViewSupplier.get();//首次调用时延迟加载
myView.makeVisible();
}

不过,对于这种特殊情况来说,这可能是极端的。

我不认为应该纯粹根据效率来做出决定,而应该根据哪个组合更能代表您试图建模的领域。要问的问题是“对于使用视图的类,哪种结构是正确的?”

使用实例变量不是全局变量-它包含在声明它的对象的上下文中。虽然公共静态变量非常接近,但OO中不应该存在全局变量

首先要确定的是相对于使用它的类/方法的意图,您的“视图”实例在逻辑上所属的位置。如果使用它的类是某种工厂,“myMethod”是工厂方法,那么yes返回一个新实例

如果“视图”是类的逻辑字段,并且在某种程度上有助于捕获和增强其状态和行为,那么没有理由每次都创建一个新的视图。只需保持其状态,并使用现有对象即可


根据您的描述,您似乎正在尝试维护和更新某种视图的状态。将其更改为所需状态并重新显示是有意义的,而不是每次都创建一个新对象。由于这两种方法在功能上似乎都适用于您的场景,因此我将采用第二种方法,并避免创建不必要的对象。

是否要重用实例?任何时间/空间节约都会超过10倍的理智成本。