重用相同的变量以继续创建新的Object实例(如情况2)是否正确?
一些伪代码:
//case 1:
class main {
List<Foo> bar = new ArrayList;
public static main(String[] args) {
Foo baz = new Foo(params);
Foo baz1 = new Foo(differentParams);
Foo baz2 = new Foo..
}
}
class Foo {
Foo(params..) {
main.bar.add(this);
}
}
//case 2:
class main {
List<Foo> bar = new ArrayList;
public static main(String[] args) {
Foo baz = new Foo(params);
baz = new Foo(differentParams);
baz = new Foo..
}
}
class Foo {
Foo(params..) {
main.bar.add(this);
}
}
我想知道案例2是否是可以的设计实践。因为在Foo中,我将类的实例存储在main中的列表中,所以在运行时我将不需要直接对象变量baz1,而是将遍历列表以将逻辑应用于每个对象。
所以我的问题是,重用相同的变量以继续创建新的Object实例是否是一种正确的做法(如情况2)?传统做法建议您在制作对象时为它们保留一个单独的变量(如情况1)。
在思考内存以及与案例1相比,案例2是否会节省更多的内存时,我想到了这个问题,因为您不必每次都声明一个新变量。
答案 0 :(得分:0)
在思考内存以及与案例1相比,案例2是否会节省更多的内存时,我想到了这个问题,因为您不必每次都声明一个新变量。
在Android上,内存受到严重限制,IIRC应用程序只能使用20 MB。一个变量可能需要4个字节,而您要保存两个变量,即8个字节。这意味着当您编写250,000个此类时,将节省2 MB,即10%的可用内存。
您要编写25万个这样的类吗?
我希望你不是。
但是,这并不重要,因为局部变量仅在调用该方法时存在,并且没有人关心8个字节。
此外,您的代码由优化的编译器处理,该编译器不会逐行转换代码。因此,两个版本的生成代码可能没有差异。
所以,请不要尝试优化无关的细节。
改为编写正确的代码。如您所说,“构造函数不应有副作用,也不应逃脱this
”。
我建议这样的事情:
class Main { // class names are always UpperCamelCase
private List<Foo> bar = new ArrayList; // "private"
public static main(String[] args) {
new Main().go(); // leave the static context ASAP
}
private void go() {
bar.add(new Foo(params));
bar.add(new Foo(differentParams));
bar.add(new Foo(....));
}
}
那里没有魔术。构造函数构造并且什么也不做。
所有内容都会显式添加...这可能会很冗长,但是您只需要编写一种方法封装常用操作即可。