java - 将“this”分配给构造函数中的私有字段
问题描述
我环顾四周,但找不到关于this
在私有字段中分配是 Java 中的反模式的明确答案。考虑以下基于单例模式的示例:
public class Foo {
private static Foo INSTANCE;
private Foo() {
INSTANCE = this;
}
}
我的猜测是,在声明时,
this
它没有完全初始化,所以它是不安全的,就像任何其他调用会使用该static
字段一样,它可能会找到一个它没有完全初始化的实例。
那是正确的吗?这是我们应该避免的吗?如果是,为什么?有什么方法可以确保这些调用是安全的(因为我们不会INSTANCE
在构造函数中进一步使用)?
解决方案
每次构造此类的新实例时,都会覆盖该字段。真的是一个更好的INSTANCE
名字LAST_CREATED_INSTANCE
。
也就是说,鉴于未声明该字段,对该字段volatile
的写入并不能保证跨线程的可见性。所以更像是SOMEWHAT_RECENTLY_CREATED_INSTANCE
。
所以,是的,这很糟糕。我看不出所呈现的实现将是最佳解决方案的任何情况。
Java 中的单例实现已经详细讨论过了。除了作为练习之外,您应该没有真正的理由必须设计自己的。
请参阅 Josh Bloch 的Effective Java的第 3 项,摘录如下:在 Java 中实现单例模式的有效方法是什么?(虽然我建议阅读整本书)
推荐阅读
- php - Laravel:语法错误或访问冲突:1055解决方案
- javascript - php代码总是与html代码混合吗?
- android - OnPreviewFrame(IntPtr data, Camera camera) 未被调用 | FastAndroid相机
- python - Python大整数性能
- javascript - 按字符串日期值对数组列表进行排序
- typescript - 像 SomeType 这样的类型是什么意思
在打字稿中? - javascript - 找不到标题高度。你在 Stack 的屏幕内吗?
- mysql - MySQL中的系统目录信息函数和表
- spring-cloud-dataflow - Spring Cloud Gateway:QUERY_PARAM 的字符“=”无效
- kubernetes - 用于 kubernetes pod 和气流工作日志的 DNS