`

单例类问题

 
阅读更多

有人在iteye上提出了单例类的问题,下面是一个精彩的回答。

 

写一个单例应该需要考虑一个重要问题,对象是怎么创建的:
1
、通过构造函数创建
2
、通过反射创建
3
、通过反序列化创建
4
、通过clone创建

提供的解决方案如下:

1
、禁止外部调用构造函数设置 private

2
、禁止反射设置构造函数创建accessable,调用构造函数,可以再构造函数内判断是否已经创建过对象

3
、禁止反序列化创建对象,需要重写readResolve方法

4
、禁止clone,其实也不算禁止吧,重新clone,返回你的引用就OK

你看看你的单例有没有处理这几种情况,关于synchronized,个人还是觉得需要使用,考虑到线程安全问题

 

单例类的序列化

一个单例类要想序列化,仅让其实现serializable 是不够的,还需要写

  private Object readResolve() throws ObjectStreamException {

  return instance;

  }//这个方法可以在反序列化之后内存中不会有该类的多个实例

如下,进行序列化/反序列化

   public static void main(String[] args) throws Exception {
        
// 序列化
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(
                new FileOutputStream("c:\\Singleton.clazz"));
        Singleton singleton = Singleton.uniqueInstance;
        objectOutputStream.writeObject(singleton);
        objectOutputStream.close();
      
 // 反序列化
        ObjectInputStream objectInputStream = new ObjectInputStream(
                new FileInputStream("c:\\Singleton.clazz"));
        Singleton singleton2 = (Singleton) objectInputStream.readObject();
        objectInputStream.close();
      
 // 比较是否原来的实例
        System.out.println(singleton == singleton2);
    }//
如果不加readResolved方法,两个结果不相等,加上,则相等。

 

分享到:
评论

相关推荐

    Java单例类

    Java单例类是一种常见的设计模式,具有三个特点:单例类只能有一个实例、单例类必须自己创建自己的唯一实例、单例类必须给所有其他对象提供这一实例。单例模式可以分为三种:懒汉子式单例、饿汉子式单例、注册式单例...

    ios播放单例类 singleton

    在iOS开发中,单例(Singleton)是一种常用的...总的来说,这个`SoundManager`单例类是为了解决iOS应用中音频播放的管理和同步问题,通过全局的访问点,简化了多视图间的音频操作,提高了代码的可复用性和可维护性。

    Sqlite3 C++ 简单单例数据库操作类封装

    为了保证线程安全,单例类的实例化通常会在第一次调用`getInstance()`时进行,使用互斥锁或原子操作来确保多线程环境下的正确性。此外,还需要考虑在程序退出时关闭数据库连接,防止资源泄露。 总结来说,"Sqlite3 ...

    FMDB的自定义单例类的数据库demo

    **FMDB自定义单例类数据库Demo详解** 在iOS应用开发中,数据库是存储和管理数据的重要工具。FMDB是一个Objective-C的SQLite数据库管理库,它使得在iOS中使用SQLite数据库变得简单易行。本教程将详细介绍如何创建一...

    C++中的单例模式及按需释放模型

    特别是在大型项目中,随着单例类的数量增加,这种问题更加突出。 为了解决这个问题,我们需要实现一个按需释放的单例模式,即在确定不再使用某个单例时,能够及时地释放其占用的内存。要做到这一点,单例类需要具备...

    java中的单例模式

    单例模式的基本思想是确保一个类在任何情况下都只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这样可以避免因为创建多个实例导致的资源浪费和状态不一致的问题。 在Java中,实现单例模式主要有两种方式...

    unity中涉及的三种单例模式

    在Unity游戏开发中,单例模式是一种常用的编程设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在处理需要跨场景共享数据的情况时尤其有用,因为Unity的场景切换可能导致对象被销毁,而单例则...

    C++单例模式示例代码

    1. 封锁构造函数:单例类的构造函数通常声明为私有(private),防止外部直接实例化。 2. 创建静态成员变量:定义一个静态私有成员变量,用于存储单例实例。 3. 提供公有静态获取实例的方法:这个方法通常称为`...

    c++单例模式线程日志类

    在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在这个特定的场景中,我们讨论的是一个实现了单例模式的日志类,该类专为多线程环境设计,具备日志等级控制、...

    单例模式,single

    2. **类加载器问题的解决**:为了解决不同类加载器加载同一个类产生的问题,可以在单例类中添加一个私有构造函数,并在构造函数中进行检查,确保每次加载的都是同一个实例。 3. **序列化问题的解决**:如果单例类...

    java单例模式的例子

    - 扩展困难:如果需要为单例类添加新功能,修改代码可能会影响其他模块。 - 难以测试:由于没有构造函数,单元测试变得复杂。 - 可能违反单一职责原则:单例类可能承担过多职责,不符合设计原则。 在实际开发中...

    枚举类实现单例,并且解决序列化给前端展示的问题.zip

    本源码由 springboot 开发,只有2个简单的文件(1是 枚举类单例,2是 controller请求测试类)。 主要测试了枚举类的饿汉式加载机制 / 单例机制。 代码中包含枚举类的基本使用,和完整的请求示例。 主要实现了枚举类...

    单例的例子与UML图

    单例模式是软件设计模式中的一种经典模式,它保证了类在系统中只有一个实例存在,同时提供了全局访问点。这种模式常用于系统配置、数据库连接、缓存管理等场景,以减少资源消耗并确保一致性。 单例模式的核心在于...

    IOS官方标准_单例模式

    然而,单例模式也存在一些潜在问题: 1. **过度使用**:过度依赖单例可能导致代码紧密耦合,不利于测试和扩展。 2. **线程安全**:虽然上述代码考虑了线程安全,但在特定情况下,仍可能存在竞态条件,需要额外的...

    单例模板类+vector排序

    通过这种方式,我们可以利用单例模板类实现对不同结构体类型数据的统一管理与排序,避免了多次实例化和全局变量的问题,同时也保证了数据的有序性。 在项目"ConsoleApplication2"中,你可能会看到一个实际应用这个...

    Qt多工程调用单例实现,带线程锁

    描述中提到的"DataSource是一个单例类,做了测试在不同类中调用单例函数依旧能保证唯一性",这表明DataSource类已经被正确地设计为单例模式。在单例类中,通常会有一个静态成员函数(如getInstance())来返回唯一的...

    单例模式(Singleton)的6种实现

    1. 单例类(Singleton)拥有一个私有无参构造函数,防止其他对象通过new操作符创建类实例。 2. 单例类持有私有的静态成员变量instance,用于保存该类的唯一实例。 3. 单例类提供一个公有的静态方法Instance(),用于...

    OC单例模式讲解

    1. **声明单例类**:首先定义一个类,并且确保它有一个私有的构造函数,防止外部通过构造函数来创建新的实例。 2. **私有化构造函数**:为了保证单例模式的唯一性,需要将构造函数声明为私有的。 3. **声明并初始化...

    ios-FMDBsharedInstance 多线程FMDB单例类.zip

    当我们谈论“ios-FMDBsharedInstance 多线程FMDB单例类”时,我们关注的是如何在多线程环境中高效、安全地使用FMDB的单例模式。 首先,让我们了解FMDB的基本概念。FMDB是Facebook开源的一个Objective-C SQLite库,...

    Java单例模式应用研究.pdf

    如上所示,饿汉式单例类在类加载时即创建实例。这种方式简洁明了,但可能会导致资源浪费,因为即使没有使用这个单例,也会在一开始就创建实例。 #### 四、懒汉式单例模式 懒汉式单例模式是在第一次使用时才创建...

Global site tag (gtag.js) - Google Analytics