1

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

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类保持开放的灵活性。也许?

这样的事情会有并发/同步问题吗?

对于非常模棱两可的示例代码,我深表歉意。

4

2 回答 2

2

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

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

于 2012-10-20T15:35:07.933 回答
0

您使用它的方式是mix-upofstatic factories和 normal object creation。所以在你的情况下,你不会有任何concurrency issue.

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

这是书中的第一个条目: -Effective Java说,Consider static factory methods instead of constructors

以下是该项目中列出的优势的引述:-

静态工厂方法的一个优点是,它们有名称,不像构造函数。如果构造函数的参数本身并不能描述返回的对象,那么具有良好名称的静态工厂更易于使用。

因此,您可以使用不同类型static methods的名称来显示他们将做什么。对于 EG:-

  • getInstance()一般应该用来返回现有的实例
  • newInstance()应该用于在每次调用时创建新实例

所以,你的singleton实现应该是这样的: -

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

    private Demo() {
    }

    public static Demo getInstance() {
        return demo != null? demo: new Demo();
    }
}
于 2012-10-20T15:32:31.070 回答