「java静态方法单例」java 静态内部类 单例
本篇文章给大家谈谈java静态方法单例,以及java 静态内部类 单例对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
关于java静态内部类形式的单例模式
static Singleton instance = new Singleton();
static类型的成员变量,只会在新建类的对象时被执行一次。
所以static Singleton instance = new Singleton(); 只有在第一次调用时,被new一次。之后获取的都是第一次执行的对象。所以称之为单例。
也可以使用老的写法,比较清晰一些。
class ABC {
private static ABC instance;
private ABC() {}
public ABC getInstance() {
if (instance==null)
instance = new ABC();
return instance;
}
}
这样写法的缺点是效率不如
class ABC {
private static ABC instance= new ABC();
private ABC() {}
public ABC getInstance() {
return instance;
}
}
这样写法高。
单例模式和静态类的区别
1什么时候使用静态类代替singleton :
这里有几个很好的静态类比singleton更好的应用场景. 最基本的例子就是在Java中的java.lang.Math类的实现方式, Math类就是用过静态方法来实现的,而不是单例来实现的.
总结 :
如果你的singleton不提维持任何状态, 仅仅是提供全局的访问 , 这个时候就适合用静态类 , 这样速度也更快, 因为static bind在编译期间(compile during) . 记住不经意维持子类的状态 , 尤其是在并发的情况下, 多个线程并发修改,这容易导致不容易发现的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.
3singleton相对于静态类的一些高级特点 :
singleton 对于static class 主要的优点是更加面向对象 . 对于singleton你可以使用继承(Inheritance)和多态(polymorphism)来继承一个基类, 实现一个接口, 提供不同功能 的实现. 例如 , Java中java.lang.Runtime ,该类就是一个singleton的, 调用getRuntime(),基于不同的JVM ,返回不同的实现对象, 针对一个一个JVM,确保只有一个Runtime对象 , 如果使用static class就不能很好的来实现这样的功能了 .
1,应用场景
概况:当需要资源共享且需要控制资源的时候
1)有频繁实例化然后销毁的情况,也就是频繁的new对象的时候,可以考虑单例模式。
举例一:
统计上机在线人数,也就是全局计算器,所有用户在相同时刻获取到的在线人数是一致的。这里就需要一个全局的唯一访问点,所以计数器就要唯一。
2)创建对象时,消耗的时间和资源过多,但又经常用到的对象
举例二:配置文件访问类,项目中需要一些环境相关的配置文件。如果不用单例,每次调用都要new对象,每次都要重新读一遍配置文件,很影响性能。如果用单例,则只需要读取一遍就可以了。
三、单例与static的区别
1,static在类加载时执行一次,其生命周期是跪着类方法的执行而结束,其不需要再new对象,因为在类加载时就new对象了。所以static有更好的性能。
2,工具类适用于static,因为有更好的访问效率(和状态有关的用单例模式,如游戏中全局的一些状态和变量)
3,单例模式更加面向对象,可使用继承或多态来继承一个基类,实现一个借口,不同的功能。
java单例模式和静态方法有什么区别
找到知乎一个很好的答案:
两者占内存不一样吧。
没记错的话,类加载的时候都要加载类的定义;执行方法的时候都要占用栈;但是单例需要在堆里面new一个内存空间出来,静态方法ms不用。
我的习惯用法是不需要依赖于其它类或资源时,用静态方法,这时就是一个面向过程的函数而已;如果需要依赖其它类的实例,或者需要某些资源时,用单例。
JAVA static 单例模式
单例模式可以理解为是面向对象语言中对全局变量的一种实现,当然的作用不仅仅限于此。我们可以对单例模式实现的过程中的思路进行一下剖析,如此更加清楚的认识到设计模式究竟是什么,当然也可以证明一下基础知识的重要性(基础才是王道)。
首先我们分析一下单例的意义,在Java中为一个类只能有一个实例化对象。这显然不是我们平常所写的一个普通类所能够做到的事情。那么为了实现这一个要求该如何去做呢。实例化是一个类的初始化时候的问题,而初始化是构造方法去做的事情(当然这里面jvm也帮我们做了很多的事情)。构造方法,我们要设为私有。这样我们让该类不能被随意的初始化,那该在哪初始化,而它有怎样被调用呢。
一个不能初始化的类,也就是说不能够被实例化的类,我们想要调用。那么无疑让我们想到了static关键字,一个public static 的方法可以实现我们这个要求——即在不实例化类的情况下能够调用其中的方法。于是我们写下了一个public static 的方法,用于得到这个类的唯一实例。而这个实例我们是在类的内部实例,并同样定义为 static 的变量(一直用static 只是为了能够不实例化便可以使用。因为static可以在类初始化的时候便生成了,对于此不理解的同学们可以查看我的前一篇博客。。。)。到这里我们一个单例模式的实现框架其实已经搭好了。
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能力的对象时,选择单例,如果仅仅是将一些静态方法预售,使用静态类。
关于java静态方法单例和java 静态内部类 单例的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-12,除非注明,否则均为
原创文章,转载请注明出处。