美文网首页
3.使用私有构造方法或枚类实现Singleton

3.使用私有构造方法或枚类实现Singleton

作者: Orange_____ | 来源:发表于2019-01-23 18:18 被阅读0次

单例的类只有一个实例。即一个类只有一个对象实例
常见实现单例的方法有两种, 两者都是基于构造器私有, 然后对外提供该类的实例作为静态变量

第一种方法就是使用final修饰静态变量

public class Foo {

    private Foo() {
    }

    public static final Foo foo = new Foo();

    public void doSomething() {

    }

}

构造方法被设置成私有的, 在类的内部初始化对象, 使用final保证只被初始化一次, 但是需要注意, 如果调用者使用反射来调用构造器来创建对象的话, 将会导致内存中出现两个实例对象, 对此避免的方法是使其在请求创建第二个实例时抛出异常。

第二种方法是对外提供一个静态工厂方法, 静态成员变量私有化

public class Foo {

    private Foo() {
    }

    private static Foo foo = new Foo();

    public static Foo getFoo() {
        return foo;
    }

    public void doSomething() {

    }

}

每次调用getFoo()都将返回同一个Foo实例

静态工厂方法的一个优点是,它可以灵活地改变你的想法,无论该类是否为单例而不必更改其API。 工厂方法返回唯一的实例,但是可以修改,比如,返回调用它的每个线程的单独实例。 第二个好处是,如果你的应用程序需要它,可以编写一个泛型单例工厂(generic singleton factory )。 使用静态工厂的最后一个优点是方法引用可以用supplier,例如Foo::getFoo等同于Supplier<Foo>。 除非与这些优点相关的,否则公共属性方法是可取的。

如果想序列化单例类, 仅仅将implements Serializable添加到声明中是不够的。为了维护单例的保证,声明所有的实例属性为transient,并提供一个readResolve方法。否则,每当序列化实例被反序列化时,就会创建一个新的实例,为了防止这种情况, 则需要将这个readResolve方法添加到单例所在类

// readResolve方法用来提供单例对象
private Object readResolve() {
    return foo;
}

最后一种实现单例的方法是声明单一枚举类

public enum Foo {
    
    FOO;

    public void doSomething() {
    }

}

相关文章

  • 3.使用私有构造方法或枚类实现Singleton

    单例的类只有一个实例。即一个类只有一个对象实例常见实现单例的方法有两种, 两者都是基于构造器私有, 然后对外提供该...

  • 提示三

    今天看第三条:使用私有构造方法或枚类强化 Singleton 属性。 文章首先介绍了两种常见的实现单例的方法。第一...

  • 强化Singleton属性

    法则:用私有构造器或枚举类型强化Singleton属性 实现Singleton的三种方法: 把构造器保持为私有的,...

  • Effective Java 第3条:用私有构造器或枚举类型强化

    Singleton:仅仅被实例化1次的类.Java 1.5 之前,有两种方法实现Singleton: 1 私有构造...

  • 读 effective java 中文版第二版读后感(第二天)

    第三条 用私有构造器或者枚举类型强化Singleton属性 1.第一种实现方法 通过私有构造器的方法实现: 弊端:...

  • 2018-07-09学习小结 - 包及访问权限6

    学习 18.5 构造方法私有化——单例设计模式(Singleton) 范例 18-9 自动生成的构造方法的类 包含...

  • 单例模式

    使用一个私有构造方法、一个私有静态变量以及一个共有静态方法实现。私有构造方法保证了不能通过构造方法来创建对象实例,...

  • 单例模式

    Singleton pattern 限定类对象只有一个实例核心原理是将构造函数私有化,并且通过静态方法获取一个唯一...

  • 03-用私有构造器或者枚举类型强化Singleton属性

    阅读原文03-用私有构造器或者枚举类型强化Singleton属性  Singleton指仅仅被实例化一次的类。Si...

  • 单例模式

    单例模式 单例模式几乎是最简单的模式了 私有化构造方法。 静态的Singleton singleton和getIn...

网友评论

      本文标题:3.使用私有构造方法或枚类实现Singleton

      本文链接:https://www.haomeiwen.com/subject/heesjqtx.html