美文网首页
Android 单例

Android 单例

作者: GODANDDEVIL | 来源:发表于2020-02-28 16:27 被阅读0次

定义:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

特点:单例类只能有一个实例;单例类必须自己创建自己的唯一实例;单例类必须给所有其他对象提供这一实例。

1、静态内部类 static nested class

这种写法使用JVM本身机制保证了线程安全问题。由于静态单例对象没有作为ToolFunction的成员变量直接实例化,因此类加载时不会实例化ToolFunction,第一次调用getInstance()时将加载内部类ToolFunctionHolder,在该内部类中定义了一个static类型的变量INSTANCE ,此时会首先初始化这个成员变量,由Java虚拟机来保证其线程安全性,确保该成员变量只能初始化一次,由于getInstance()方法没有任何线程锁定,因此其性能不会造成任何影响。并且由于 ToolFunctionHolder 是私有的,除了 getInstance() 之外没有办法访问它,因此它是懒汉式的;同时读取实例的时候不会进行同步,没有性能缺陷;也不依赖 JDK 版本

示例代码:

/**
     * 自定义的工具类单例
     */
public class Tool {  
    private static class ToolHolder {  
        private static final Tool INSTANCE = new Tool();  
    }  
    private Tool (){}  
    public static final Tool getInstance() {  
        return ToolHolder.INSTANCE; 
    }  
}
/**
     * 判断一个字符串是否是一个合法的ip地址:
     *    1 首先检查字符串的长度 最短应该是0.0.0.0 7位 最长 000.000.000.000 15位
     *    2 按.符号进行拆分,拆分结果应该是4段
     *    3 检查每个字符串是不是都是数字
     */
     boolean isIP(String str){
        // 1、首先检查字符串的长度 最短应该是0.0.0.0 7位 最长 000.000.000.000 15位
        if(str.length()<7 || str.length() >15) return false;
        // 2、按.符号进行拆分,拆分结果应该是4段,"."、"|"、"^"等特殊字符必须用 \ 来进行转义
        // 而在java字符串中,\ 也是个已经被使用的特殊符号,也需要使用 \ 来转义
        String[] arr = str.split("\\.");
        if( arr.length != 4 )    return false;
        // 3、检查每个字符串是不是都是数字,ip地址每一段都是0-255的范围
        for(int i = 0 ; i <4 ; i++ ){
            if (!isNUM(arr[i]) || arr[i].length()==0 || Integer.parseInt(arr[i])>255 || Integer.parseInt(arr[i])<0){
                return false;
            }
        }
        return true;
    }

    /**
     * 判断一个字符串是否是数字
     */
    boolean isNUM(String str){
        Pattern p = Pattern.compile("[0-9]*");
        Matcher m = p.matcher(str);
        return m.matches();
    }

2、枚举

通过Tool.INSTANCE来访问实例,这比调用getInstance()方法简单多了。创建枚举默认就是线程安全的,所以不需要担心double checked locking,而且还能防止反序列化导致重新创建新的对象

示例代码:

/**
 * 自定义一个单例
 */
public enum Tool {
    INSTANCE;
    /**
     * 判断一个字符串是否是一个合法的ip地址:
     *    1 首先检查字符串的长度 最短应该是0.0.0.0 7位 最长 000.000.000.000 15位
     *    2 按.符号进行拆分,拆分结果应该是4段
     *    3 检查每个字符串是不是都是数字
     */
     boolean isIP(String str){
        // 1、首先检查字符串的长度 最短应该是0.0.0.0 7位 最长 000.000.000.000 15位
        if(str.length()<7 || str.length() >15) return false;
        // 2、按.符号进行拆分,拆分结果应该是4段,"."、"|"、"^"等特殊字符必须用 \ 来进行转义
        // 而在java字符串中,\ 也是个已经被使用的特殊符号,也需要使用 \ 来转义
        String[] arr = str.split("\\.");
        if( arr.length != 4 )    return false;
        // 3、检查每个字符串是不是都是数字,ip地址每一段都是0-255的范围
        for(int i = 0 ; i <4 ; i++ ){
            if (!isNUM(arr[i]) || arr[i].length()==0 || Integer.parseInt(arr[i])>255 || Integer.parseInt(arr[i])<0){
                return false;
            }
        }
        return true;
    }

    /**
     * 判断一个字符串是否是数字
     */
    boolean isNUM(String str){
        Pattern p = Pattern.compile("[0-9]*");
        Matcher m = p.matcher(str);
        return m.matches();
    }
}

转载自:https://lrh1993.gitbooks.io/android_interview_guide/content/design-mode/Builder-Pattern/Singleton-Pattern.html

相关文章

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • LayoutInflater源码分析

    在《(-)Android中的单例模式》分析中,我们分析了Android中单例模式的实现,且以LayoutInfla...

  • JAVA基础之单例

    JAVA单例的几种形式以及其优缺点。 Android 中的单例模式 - 简书 单例的定义:Singleton模式的...

  • Android 单例模式学习

    android的单例模式学习 1 饿汉单例模式 优点 : 缺点 : 2.0 懒汉模式 优点 : 缺点 : 2.1 ...

  • 11.1设计模式-单例模式-详解

    单例模式: 单例介绍 单例的六种写法和各自特点饿汉、懒汉、懒汉安全、DCL、静态内部类、枚举。 android中的...

  • Android 单例

    定义:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例...

  • 单例模式(二)

    单例模式在Android源码中的应用 除了之前说的几种单例的实现方式之外还可以使用容器来实现。 在Android的...

  • (一)Android中的单例模式

    作为一个Android开发的老司机,或者刚入行的司机,我觉得你还是有必要学习下Android的单例模式,毕竟单例模...

  • 简单聊聊单例模式

    单例模式应该是Android开发中常用的一种设计模式。不仅我们经常用到,Android源码中也经常可以看到单例模式...

  • 内存泄露优化总结

    1、单例导致内存泄露 单例模式在Android开发中会经常用到,但是如果使用不当就会导致内存泄露。因为单例的静态特...

网友评论

      本文标题:Android 单例

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