Java 重用同一对象变量以创建多个对象

Java 重用同一对象变量以创建多个对象,java,performance,variables,design-patterns,Java,Performance,Variables,Design Patterns,重复使用同一个变量以不断创建新的对象实例(如案例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 = n

重复使用同一个变量以不断创建新的对象实例(如案例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);
    }
}
//案例1:
班长{
列表栏=新的ArrayList;
公共静态main(字符串[]args){
Foo baz=新的Foo(参数);
Foo baz1=新的Foo(不同的图形);
Foo baz2=新Foo。。
} 
}
福班{
Foo(参数..){
main.bar.add(这个);
}
}
//案例2:
班长{
列表栏=新的ArrayList;
公共静态main(字符串[]args){
Foo baz=新的Foo(参数);
baz=新的Foo(不同的图形);
baz=新Foo。。
}
}
福班{
Foo(参数..){
main.bar.add(这个);
}
}
我想知道案例2是否是一个好的设计实践。因为在Foo中,我将类的实例存储在main中的列表中,所以在运行时我永远不需要直接对象变量baz1,而是将遍历列表以对每个对象应用一些逻辑

所以我的问题是,重用同一个变量来不断创建新的对象实例(如案例2)是一种正确的做法吗?传统做法建议在创建对象时为对象保留一个单独的变量(如案例1)

在考虑内存时,我想到了这个问题,因为您没有每次声明一个新变量,所以是否执行案例2会比案例1节省更多内存

在考虑内存时,我想到了这个问题,因为您没有每次声明一个新变量,所以是否执行案例2会比案例1节省更多内存

在Android上,内存严重受限,IIRC应用程序只能使用20MB。一个变量可能需要4个字节,您可以保存两个变量,即8个字节。这意味着,当您编写250000个此类类时,可以节省2MB,即可用内存的10%

你打算写25万这样的课程吗

我希望你不是

但是,这并不重要,因为只有在调用方法时才存在局部变量,并且没有人关心8字节

此外,您的代码由优化编译器处理,它不会逐行转换代码。因此,有可能两个版本生成的代码没有差异

所以,请不要尝试优化不相关的细节

而是编写适当的代码。正如您所说,“构造函数不应该有副作用,也不应该逃避此问题。”

我建议这样做:

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(....));
    }
}
class Main{//类名总是大写的
私有列表栏=新建ArrayList;/“私有”
公共静态main(字符串[]args){
new Main().go();//尽快离开静态上下文
}
私人空间{
添加(新的Foo(参数));
添加(新的Foo(不同的图形));
新增(新富(……);
}
}
没有魔法。构造函数构造,不做其他任何事情


所有内容都被显式添加。。。这可能会变得冗长,但您只需编写一个封装常见操作的方法。

感谢您宝贵的输入。如果我正确解释了您的伪代码,您甚至不应该使用变量。但是,好吧,这是伪代码…我扩展了代码,我没有一个实际的程序,我写了这个还没有得到一个完整的例子仍然不是有效的Java代码,但更接近。您从未使用任何变量,所以不要使用变量:
newfoo(params);新Foo(不同图形)。这太难看了,因为构造函数不应该有副作用,也不应该逃避这个问题,但这是另一个问题。谢谢,这就是我想要的:)