我有一个愚蠢的问题需要澄清。见下面的代码。 Ex 1 ,我创建了一个MySecondClass
的实例,并在每个方法中使用它。我每次都不创建一个实例,无论什么时候都需要它。
但是在 Ex 2 中,我在每个方法中创建了MySecondClass
的实例。
我想知道哪种实现在内存消耗(garbage collection
)和良好性能方面表现良好?
Ex 1 。
public class MyClass {
private MySecondClass var1 = new MySecondClass ();
public void doSomthing(){
var1 .DoMultiply();
}
public void doAnotherThing(){
var1 .DoCount();
}
}
Ex 2
public class MyClass {
public void doSomthing(){
MySecondClass mySec = new MySecondClass ();
mySec.DoMultiply();
}
public void doAnotherThing(){
MySecondClass mySec = new MySecondClass ();
mySec.DoCount();
}
}
确定完成代码我添加了调用者类。
public class Caller {
public static void main(String arg[]){
MyClass myClass = new MyClass (); // first instance
myClass.doSomthing();
MyClass myClass2 = new MyClass (); // second instance
myClass2.doAnotherThing();
}
}
答案 0 :(得分:0)
两者都具有相同的内存消耗(O(1)
),但后者为垃圾回收器提供了更多的工作,因为在每个方法运行MySecondClass
后都有资格进行垃圾回收。
如果您的方法功能正常,并且您无法弄清var1
(MySecondClass
)的状态,那么第一个选项就有意义。
所以基本上没有更多的信息,很难分辨哪一个。
答案 1 :(得分:0)
通常,它们的行为会有所不同,在每次方法调用后(在Ex 2中)对象都符合GC 的条件,但这并不意味着它们会在立即离开方法后被清除。实际上,当GC实际运行时,内存将被回收,并且当年轻一代或老一代的内存存在压力时会发生这种情况。
如果你的对象创建很便宜并且这个对象足够小,那么很可能你甚至不会觉得垃圾收集发生了(因为它会在年轻一代中发生)。除非您确定这是应用程序中的瓶颈,否则将对象移动为实例字段。
个人信息
我会选择in-method方法,因为这会增加线程的安全性,而且你永远不知道将来你的类将被用在哪里。