重用相同的Object变量来创建多个对象

时间:2018-07-28 12:37:50

标签: java performance variables design-patterns

重用相同的变量以继续创建新的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是否会节省更多的内存时,我想到了这个问题,因为您不必每次都声明一个新变量。

1 个答案:

答案 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(....));
    }
}

那里没有魔术。构造函数构造并且什么也不做。

所有内容都会显式添加...这可能会很冗长,但是您只需要编写一种方法封装常用操作即可。