1. 关于java静态内部类形式的单例模式
static Singleton instance = new Singleton();
static类型的成员变量,只会在新建类的对象时被执行一次。
所以static Singleton instance = new Singleton(); 只有在第一次调用时,被new一次。之后获取的都是第一次执行的对象。所以称之为单例。
也可以使用老的写法,比较清晰一些。
classABC{
privatestaticABCinstance;
privateABC(){}
publicABCgetInstance(){
if(instance==null)
instance=newABC();
returninstance;
}
}
这样写法的缺点是效率不如
classABC{
privatestaticABCinstance=newABC();
privateABC(){}
publicABCgetInstance(){
returninstance;
}
}
这样写法高。
2. 单例模式&静态类
单例模式指的是在应用整个生命周期内只存在一个实例。单例模式是一种被广泛使用的设计模式。他能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存。
静态类就是一个类内部是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。
(1)单例模式更加灵活,其中的方法可以被重写,而静态类中的方法皆为静态,无法被重写;
(2)当一个类占用资源多时,单例模式可以采用懒加载模式,静态类无法做到.
静态的绑定是在编译期进行的,也就是说静态类中的方法从一开始就全部加载完毕了。而单例模式分为“饿汉模式”、“懒汉模式”。在“饿汉模式下”,单例模式的类在获取instance前就已经初始化好了,这种方式适合类占用资源较少的情况;在“懒汉模式”下,单例模式可以在使用时才被初始化,这种方式适合类占用资源较多的情况,这样就成功避免了资源浪费的问题。
当只需要一些简单的工具方法时,使用静态类,因为静态类更方便,更快速。当你需要面向对象的能力时(继承,多态),使用单例模式。
3. Java中单例模式和静态类的区别
单例模式:
在框架中通过反射机制在程序运行时由框架生成一个类的实例,该实例是由框架负责维护;当然我们自己也可以实例化这个类,此时我们自己实例化的对象和框架维护的实例是互不影响的;
类的实例对象是由引用指向堆中保存的,单例是由框架中的引用指向堆中的一个实例,而我们自己创建的对象是另一个指向堆中的实例两个互不干扰;但是在使用起来,我们在不同地方改变单例全局的单例都变了,看起来好像静态一样但是实际上我们使用的只不过都是框架维护的一个实例而已;
举例:
@Component
publicclassPerson{
privateStringname;
PrivateIntegerage;
//getset方法...省略不想写;
}
在框架启动时,我们就获得了一个Person类的实例,这个实例由框架内部一个引用指向,在程序使用时我们只需把地址赋于需要的地方,也就是说实际上大家用的都是一个对象;
就在这时,我们自己开心的new 了一个Person对象;此时我们通过set方法改变该对象不影响其他指向单例对象的变量;
静态类:
首先java中的静态类指的大多数是内部类;作为一个成员变量它静态才有意义,此时无论程序中的任何部分调用了该静态类的外部类,并通过方法改变了内部类的数据;此时该程序中的所有该内部类的实例都改变了,互相影响;因为静态变量是存储在方法区内的,而且就一份,无论谁使用该静态变量都是去方法区查询该对象的状态,所以互相干扰;
4. Java中单例模式和静态类的区别
单例模式与静态类(一个类,所有方法为静态方法)是另一个非常有趣的问题,在《Java中有关单例模式的面试问题》博文中露掉了,由于单例模式和静态类都具有良好的访问性,它们之间有许多相似之处,例如,两者可以直接使用而无须创建对象,都可提交唯一实例,在一个非常高的高度上看起来它们都为是用于同样的任务。由于它们具有较多的相似性,面试官常常会问一些类似为神马使用单例模式替换静态方法?你能使用静态类替换单例模式吗?Java中单例模式与静态的区别有那些?等这样的问题,为回答这些问题,记住他们单例模式和静态方法之间基本的区别是非常重要的,前者给你一个Object,后者仅仅提供静态方法,由于对像比方法具有较强的能力,可以指导你神马时候使用单例模式与静态方法。
在本文中,我们会了解神马Java中的神马地方使用单例模式,神马时候使用静态类更好,顺便说下,JDK中有几个关于两者的例子,并且这例子非常聪明的,例如java.lang.Math是一个final类,并且其方法为静态方法,另一方面java.lang.Runtime是一个单例的类。对于那些不熟悉单例模式或静态类的人,静态类就是一个Java类,它仅包含静态方法,一个非常好静态类的例子就是java.lang.Math,它包括了许多为不同数据功能实现工具方法,例如sqrt(),而单例类,在整个应用生命周期内只有一个实例,例如java.lang.Runtime。
神马时候在Java中使用静态类替换单例
确实存在一些场景,静态类比单例更适合,这个场景中主要的一个例子就是java.lang.Math,它不是单例的,其所有方法都是静态方法,这里我给出几个场景,我觉得使用静态类比单例模式更适合。
1)
如果你的单例不需要维护任何状态,仅仅提供全局访问的方法,这种情况考虑使用静态类,静态方法比单例更快,因为静态的绑定是在编译期就进行的。但是要记住,不建议在静态类中维护状态信息,特别是在并发环境中,若无适当的同步措施而修改多线程并发时,会导致坏的竞态条件。
如果你需要将一些工具方法集中在一起时,你可以选择使用静态方法,但是别的东西,要求单例访问资源时,应该使用单例模式。
Java中单例与静态的区别
这是回答关于单例与静态的第二面试问题,如我早些提到过的,它们基本的区别一个表现类,一个表现方法,下面列几条它们之间的区别。
1) 静态类比单例具有更好的性能,因为静态方法在编译期绑定。
2) 再次,它们的区别是override的能力,因Java中的静态方法是不可以覆盖的,这就导致其木有太多的灵活性,另一面,你可通过继承的方式覆盖单例类中定义的方法。
3) 静态类很难模拟,因此难于单例测试,单例更容易模拟,因为也比静态类易于编写单元测试,不论神马单例期望神马,你都可以传递模拟对象,例如构造方法或方法参数。
4) 如果你的需求中需要维护状态信息,则单例比静态类更适合,因为后者在维护状态信息方面是非常可怕的,并导致狡滑的bug。
5) 如果是一个非常重的对象,单例可以懒加载,但是静态类没有这样的优势,并且非常热切的加载。
6) 许多依赖注入的框架对单例都有良好的管理,例如Spring,使用它们非常容易。
两者之间的这些区别,有助于我们在面对一些场景时做出选择,下一节中了解神马时候选择单例而不是静态类。
Java中,选择单例而不是静态类的优点
单例与静态主要的优点是前者比后者更具有面向对象的能力,使用单例,可以通过继承和多态扩展基类,实现接口和更有能力提供不同的实现,如果我们讨论java.lang.Runtime,在Java中它是单例,调用getRuntime()方法,会基于不同的JVM返回不同的实现,但也保证了每个JVM中实有一个实例,如果java.lang.Runtime是一个静态类,不太可能因不同的JVM返回不同的实现。
这就是Java中单例与静态类的区别,当你需要一个全OO能力的对象时,选择单例,如果仅仅是将一些静态方法预售,使用静态类。
5. 单例模式和静态类的区别
https://www.cnblogs.com/windpoplar/p/12944952.html
1>什么时候使用静态类代替singleton :
这里有几个很好的静态类比singleton更好的应用场景. 最基本的例子就是在Java中的java.lang.Math类的实现方式, Math类就是用过静态方法来实现的,而不是单例来实现的.
总结 :
如果你的singleton不提维持任何状态, 仅仅是提供全局的访问 , 这个时候就适合用静态类 , 这样速度也更快, 因为static bind在编译期间(compile ring) . 记住不经意维持子类的状态 , 尤其是在并发的情况下, 多个线程并发修改,这容易导致不容易发现的race condition 关于race condition .
静态类适用于一些工具类 , 其他的如单个访问资源就可以用singleton.
2>静态类和singleton之间的区别 :
① static类有更好的访问效率(Static class provides better performance than Singleton pattern, because static methods are bonded on compile time)
③ singleton比static class更容易测试. 那个容易模拟(mock), 哪个就容易测试. singleton很容易用JUnit测试, 因为你能够传递mock对象, 当singleton需要的时候(作为方法参数或者构造函数参数),
④ 如果你的需求是维护(maintain)状态, 那么singleton比static class更好 , 如果使用static class会出现一些问题.
⑤ singleton支持延迟加载 , 而static class 则不支持这样的特性 , 在重量级的对象, 延迟加载就显得非常重要.
⑥ 在一些依赖注入(Dependency injection framework)的框架 , 它能够很好的管理singleton对象 . 例如Spring.
3>singleton相对于静态类的一些高级特点 :
singleton 对于static class 主要的优点是更加面向对象 . 对于singleton你可以使用继承(Inheritance)和多态(polymorphism)来继承一个基类, 实现一个接口, 提供不同功能 的实现. 例如 , Java中java.lang.Runtime ,该类就是一个singleton的, 调用getRuntime(),基于不同的JVM ,返回不同的实现对象, 针对一个一个JVM,确保只有一个Runtime对象 , 如果使用static class就不能很好的来实现这样的功能了 .
https://blog.csdn.net/weixin_42957931/article/details/106840172
1,应用场景
概况:当需要资源共享且需要控制资源的时候
1)有频繁实例化然后销毁的情况,也就是频繁的new对象的时候,可以考虑单例模式。
举例一:
统计上机在线人数,也就是全局计算器,所有用户在相同时刻获取到的在线人数是一致的。这里就需要一个全局的唯一访问点,所以计数器就要唯一。
2)创建对象时,消耗的时间和资源过多,但又经常用到的对象
举例二:配置文件访问类,项目中需要一些环境相关的配置文件。如果不用单例,每次调用都要new对象,每次都要重新读一遍配置文件,很影响性能。如果用单例,则只需要读取一遍就可以了。
三、单例与static的区别
1,static在类加载时执行一次,其生命周期是跪着类方法的执行而结束,其不需要再new对象,因为在类加载时就new对象了。所以static有更好的性能。
2,工具类适用于static,因为有更好的访问效率(和状态有关的用单例模式,如游戏中全局的一些状态和变量)
3,单例模式更加面向对象,可使用继承或多态来继承一个基类,实现一个借口,不同的功能。
6. 单例与静态类
单例模式指的是在应用 整个生命周期内只能存在一个实例。 单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存。
静态类就是一个类里面都是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。
参考
到底是用"静态类"还是单例
7. java中关于单例和静态类的区别
单例是一种模式。这种模式的最终目的在于一个对象。
静态类是一个语法…… 就是让你在类里面能写一个普通的类而已……
这两个到底有啥关系以至于你会去思考它们的区别?
8. 请问java 单例类 与 静态类 有何不同
它们有自己的作用,灵活运用即可
简单说明:
单例类
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。
最显而易见的好处是,节约开销,比如数据库链接单例的好处是,每次你只要去获取那个数据库的实例就好,不用每次去创建一个实例。
静态类
在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不多。
在开发过程中,内部类中使用的最多的还是非静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作用。
9. JAVA static 单例模式
单例模式可以理解为是面向对象语言中对全局变量的一种实现,当然的作用不仅仅限于此。我们可以对单例模式实现的过程中的思路进行一下剖析,如此更加清楚的认识到设计模式究竟是什么,当然也可以证明一下基础知识的重要性(基础才是王道)。
首先我们分析一下单例的意义,在Java中为一个类只能有一个实例化对象。这显然不是我们平常所写的一个普通类所能够做到的事情。那么为了实现这一个要求该如何去做呢。实例化是一个类的初始化时候的问题,而初始化是构造方法去做的事情(当然这里面jvm也帮我们做了很多的事情)。构造方法,我们要设为私有。这样我们让该类不能被随意的初始化,那该在哪初始化,而它有怎样被调用呢。
一个不能初始化的类,也就是说不能够被实例化的类,我们想要调用。那么无疑让我们想到了static关键字,一个public static 的方法可以实现我们这个要求——即在不实例化类的情况下能够调用其中的方法。于是我们写下了一个public static 的方法,用于得到这个类的唯一实例。而这个实例我们是在类的内部实例,并同样定义为 static 的变量(一直用static 只是为了能够不实例化便可以使用。因为static可以在类初始化的时候便生成了,对于此不理解的同学们可以查看我的前一篇博客。。。)。到这里我们一个单例模式的实现框架其实已经搭好了。