【发布时间】:2016-11-13 09:02:11
【问题描述】:
我看到一些代码看起来像
public class A {
public void doSomething(B b) {
b.addSometing("queue1", getDefault());
b.addSometing("queue2", getDefault());
b.addSometing("queue3", getDefault());
}
private C getDefault() {
C c = new C();
c.setAutoCreate(true);
c.setExired(false);
c.setDelay(3500);
return c;
}}
如果我们把C c var. (这是 A 类的所有对象的默认设置)对于 A 类的每个对象,我们只是为 A 类的大型对象使用大量内存,也许更好地将 C c 设为静态?我们将为整个类只创建一个类 C 的实例,并将它用于类 A 的每个对象。如果我们这样做,之后的代码就会像这样
public class A {
private static C c = new C();
static {
c.setAutoCreate(true);
c.setExired(false);
c.setDelay(3500);
}
public void doSomething(B b) {
b.addSometing("queue1", c);
b.addSometing("queue2", c);
b.addSometing("queue3", c);
}
}
我认为这是更好的方法,也许我错了。请给我建议。
【问题讨论】:
-
最后一个对我来说没有多大意义,如果您将
C的相同实例添加到不同键的映射中,为什么首先考虑使用Map多个键只有一个值? -
如果你使用静态实例作为默认值,它应该是不可变的,否则你会得到副作用。
setAutocreate(true)等看起来不是一成不变的。 -
如果您对“queue1”中的 c 对象进行任何更改,那么“queue2”和“queue3”中的对象也会更改。如果这是可以接受的,那么您的静态解决方案似乎没问题。
-
为了避免静态实例,您可以尝试使用工厂来跟踪默认实例(在这种情况下必须是不可变的)或使用像 CDI 这样的 DI 框架 - 你必须再次制作如果要在没有副作用的情况下共享它们,请确保您的类是不可变的。
-
除了@Thomas 所说的,您需要 100% 确定在程序的生命周期内没有对象会更改
c的状态。另外,想想c存储的“状态”和数据。检索和使用c的进程是否需要自己的数据副本,或者它是否可以通过与其他实例共享数据(无需修改它)来工作 - 应该给你一个好主意。
标签: java oop static-class