具有内部创建自身的私有构造函数的类的静态方法

时间:2012-10-20 15:22:51

标签: java design-patterns concurrency

这更像是“这是一个安全,愚蠢或完全没必要”的问题。我想弄清楚这个代码模式是否合理:

public class SomeClass {

    private String someField;
    // Other fields here omitted for clarity

    private SomeClass() {
        someField = "some initialization goes here";
        // More initialization of omitted fields
    }

    public static void doSomething(MyObject myObject) {

        SomeClass someClass = new SomeClass();

        // Do things with myObject and someClass instance

    }
}

此代码是否存在明显(或非显而易见)问题?我认为总体目标是将doSomething方法中活动的复杂性与代码中的其他方法分开,但仍然保持SomeClass类的灵活性。可能?

是否会出现类似这样的并发/同步问题?

我为非常含糊的示例代码道歉。

2 个答案:

答案 0 :(得分:1)

这个概念不存在任何并发或同步问题,因为对于静态方法的每次调用,都存在SomeClass的单个实例,这意味着多个线程不会同时访问任何值。

至于这种设计模式的可行性,我认为这是一种合理的模式。我想不出任何实现这种模式的Java API类,但如果我找到一些,我会在这个答案中添加任何一个。通常,您会看到具有私有构造函数的类不使用该对象,而是提供一组静态方法,但实际上并没有任何理由不执行您正在执行的操作。

答案 1 :(得分:0)

您使用它的方式是mix-up static factories和正常object creation。因此,在您的情况下,您将不会有任何concurrency issue

但是,假设您想了解static factory,最好使用静态工厂,以防您只想让您的类的单个实例漫游,或者您也可以使用它们来返回实例任何子类型。

这是本书的第一项: - Effective JavaConsider static factory methods instead of constructors

以下是该项目所列优点的引用: -

  

静态工厂方法的一个优点是,它们有名称,   与构造函数不同。如果构造函数的参数没有,in和of   自己,描述返回的对象,静态工厂   精心挑选的名称更易于使用。

因此,您可以使用不同类型的static methods,其名称显示他们将要执行的操作。对于E.G: -

  • getInstance()通常应该用于返回现有实例
  • newInstance()应该用于在每次调用时创建新实例

因此,您的singleton实施应该如下: -

public class Demo {
    private static Demo demo = new Demo();

    private Demo() {
    }

    public static Demo getInstance() {
        return demo != null? demo: new Demo();
    }
}