解决方案 »

  1.   

    区别就是 第二种  可以改变 ,StaticPattern .configs =new   HashMap<String, String>(); 在工程的任何一个地方 ,都可以改变configs 使他指向另一个内存地址。第一种 SinglePattern  是不能被改变的 ,但是你在单例的类中定义了 全局的变量存在线程安全问题 ,内部的configs 也是可以改变的。若果你的变量configs 用final 修饰 就不会被改变了 , 效果就一样了。java中的静态变量只会被加载一次。
      

  2.   

    SinglePattern :内存中 存在一个  SinglePattern 这样类型的实例,(实例的存在也是因为用到所以new一个对象出来,用不到的话,这个  实例就不用new ,内存占用“可控”)StaticPattern : 没有实例(也可以有,new出来一个),直接用类名点方法调用理论上 类 SinglePattern 是有可能被 GC的,就是说这块内存是有可能被回收的但是 StaticPattern 占用的内存 则会被一直占用。个人理解
      

  3.   

    两个都加  final 呢?
      

  4.   

    两个都加  final 呢?
    我说的就是两个都加 ,效果就一样了 。若果不加final 都是可以变的。
      

  5.   

    StaticPattern .configs 是private的成员变量,没有定义setter方法,不能使他指向另一个内存地址吧
      

  6.   

    虽然你没有定义 set和get  你这个是静态的 ,直接用点就能引用了。
    私有的 本类对象是能访问的 。StaticPattern .configs 
      

  7.   

    单例是为了提供全局唯一的访问点&&同步问题,你第二种写法会出现同步问题。
      

  8.   

    http://www.360doc.com/content/13/1028/16/11253639_324825197.shtml
    楼主可以看看
      

  9.   

    1、首先纠正个楼上的错误,楼主你的第二种写法并没有把Map暴露出去,所以外部无法将configs指向别的对象,final不需要加。
    2、回答楼主的问题,主要说为什么建议使用单例而不是类的静态方法,楼主注意下你第二种方式的configs是static的,且初始化也是在static方法块中的,如果初始化过程步骤很复杂,如果再用到很多的成员变量参与初始化都需要设计成static的,且静态初始化的控制权是在Java手上的,这么做可能导致混乱。
    其实如果只是简单的映射配置文件,的确方法1、方法2都可行。