【问题标题】:Static or new instance for every object?每个对象的静态或新实例?
【发布时间】: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


【解决方案1】:

该问题的答案取决于应用程序的逻辑和/或 A 应该如何处理 C 实例。如果只需要一次特定对象的实例,我建议在 Java https://en.wikipedia.org/wiki/Singleton_pattern 中使用单例模式。

但是,如果 A 类的一个实例正在更改其 C 成员,则使用上述方法不是一个好主意,因为通过更改一个 A 对象上的 C 成员,您可能会干扰已完成的计算与或在另一个 A 对象上。

如果 C 成员包含所有对象使用的配置选项或数据(如上例所示),因此不会更改,您可以使用单例模式使其可供所有 A 实例访问——在我看来这很好。

最好, 朱利安

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多