Java中的守护程序线程是什么?
在Java中实现单例模式的有效方法是什么?
高分回答:
很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}很多的知识点,真的需要写出来才会掌握!!!
根据用法,有几个“正确”的答案。
从Java 5开始,最好的方法是使用枚举:
public enum Foo {
INSTANCE;
}
复制代码
Java 5之前的版本,最简单的情况是:
public final class Foo {
private static final Foo INSTANCE = new Foo();
private Foo() {
if (INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
}
public static Foo getInstance() {
return INSTANCE;
}
public Object clone() throws CloneNotSupportedException{
throw new CloneNotSupportedException("Cannot clone instance of this class");
}
}
复制代码
让我们来看一下代码。首先,您希望课程是最终的。在这种情况下,我使用了final关键字来让用户知道它是最终的。然后,您需要将构造函数设为私有,以防止用户创建自己的Foo。从构造函数中抛出异常会阻止用户使用反射来创建第二个Foo。然后,创建一个private static final Foo字段来保存唯一的实例,并public static Foo getInstance()返回一个方法。Java规范确保仅在首次使用该类时才调用构造函数。
如果您有一个很大的对象或繁重的构造代码,并且在需要实例之前又有其他可访问的静态方法或字段可以使用,则仅在那时才需要使用惰性初始化。
您可以使用private static class加载实例。代码如下:
public final class Foo {
private static class FooLoader {
private static final Foo INSTANCE = new Foo();
}
private Foo() {
if (FooLoader.INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
}
public static Foo getInstance() {
return FooLoader.INSTANCE;
}
}
复制代码
由于private static final Foo INSTANCE = new Foo();仅在实际使用类FooLoader时才执行该行,因此这将处理惰性实例化,并确保其是线程安全的。
当您还希望序列化对象时,需要确保反序列化不会创建副本。
public final class Foo implements Serializable {
private static final long serialVersionUID = 1L;
private static class FooLoader {
private static final Foo INSTANCE = new Foo();
}
private Foo() {
if (FooLoader.INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
}
public static Foo getInstance() {
return FooLoader.INSTANCE;
}
@SuppressWarnings("unused")
private Foo readResolve() {
return FooLoader.INSTANCE;
}
}
复制代码
该方法readResolve()将确保将返回唯一的实例,即使该对象在程序的先前运行中已被序列化也是如此。
文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/7…
作者建议: 静态内部类我知道,在属性较少时使用枚举也可以,哈哈,学到了
欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!
有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞???? 求关注❤️ 求分享???? 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️