这更像是“这是一个安全,愚蠢或完全没必要”的问题。我想弄清楚这个代码模式是否合理:
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
类的灵活性。可能?
是否会出现类似这样的并发/同步问题?
我为非常含糊的示例代码道歉。
答案 0 :(得分:1)
这个概念不存在任何并发或同步问题,因为对于静态方法的每次调用,都存在SomeClass
的单个实例,这意味着多个线程不会同时访问任何值。
至于这种设计模式的可行性,我认为这是一种合理的模式。我想不出任何实现这种模式的Java API类,但如果我找到一些,我会在这个答案中添加任何一个。通常,您会看到具有私有构造函数的类不使用该对象,而是提供一组静态方法,但实际上并没有任何理由不执行您正在执行的操作。
答案 1 :(得分:0)
您使用它的方式是mix-up
static factories
和正常object creation
。因此,在您的情况下,您将不会有任何concurrency issue
。
但是,假设您想了解static factory
,最好使用静态工厂,以防您只想让您的类的单个实例漫游,或者您也可以使用它们来返回实例任何子类型。
这是本书的第一项: - Effective Java
,Consider 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();
}
}