我环顾四周,但找不到关于this在私有字段中分配是 Java 中的反模式的明确答案。考虑以下基于单例模式的示例:
public class Foo {
private static Foo INSTANCE;
private Foo() {
INSTANCE = this;
}
}
Run Code Online (Sandbox Code Playgroud)
我的猜测是,在声明时,
this没有完全初始化,所以它不安全,因为如果任何其他调用会使用该static字段,它可能会找到一个没有完全初始化的实例。
那是正确的吗?这是我们应该避免的事情吗?如果是,为什么?有没有办法确保这些调用是安全的(因为我们不在INSTANCE构造函数中进一步使用)?
每次构造此类的新实例时,都会覆盖该字段。真是一个更好的名字比INSTANCE会LAST_CREATED_INSTANCE。
也就是说,鉴于未声明该字段,对该字段volatile的写入不能保证跨线程的可见性。所以更像是SOMEWHAT_RECENTLY_CREATED_INSTANCE.
所以是的,这很糟糕。我看不到任何情况下所呈现的实现将是最佳解决方案。
已经详细讨论了 Java 中的单例实现。除了作为练习之外,您应该没有真正的理由必须自己设计。
请参阅 Josh Bloch 的Effective Java 的第 3 条,其中摘录如下:在 Java 中实现单例模式的有效方法是什么?(虽然我建议阅读整本书)