工具类是使用单例好还是静态方法好?

您所在的位置:网站首页 java静态方法和实例方法 工具类是使用单例好还是静态方法好?

工具类是使用单例好还是静态方法好?

2024-07-03 21:50| 来源: 网络整理| 查看: 265

在做项目的时候之前自己写的工具类都是静态方法,但是同事说使用单例模式的spring注入使用会好些,单例模式可以实现懒加载并且在java中也只有一个实例存在,使用static则会在程序启动的时候就被加载,但是静态方法肯定也有他的好处,所以我查了各种资料。

静态类好处:

静态类不用引用就能直接调用,但是对比单例来说,这个优点可以不计。静态类使用方便可以直接用类名进行调用,不用实例化其类。静态方法中的对象会随着静态方法的执行完毕而释放掉。如果使用单例产生唯一一个实例并且不会被GC清除,因为其中静态的属性变量不会被GC清除掉,为什么?

jvm中判断一个对象是否可以被回收的条件是通过根节点可以通过一系列路径可以到达java堆中的对象,java中可以作为根对象的有: 1、虚拟机栈(栈桢中的本地变量表)中的引用的对象。 2、方法区中的类静态属性引用的对象。 3、方法区中的常量引用的对象。 4、本地方法栈中JNI的引用的对象。 方法区是用来存放类相关的信息的地方,java中的单例类被自己类中的静态属性引用(这里就是单例模式的实现方式了)符合第二条不会被jvm收集。 单例对象不会被清除那么单例类长时间不用会不会被清除?因为jvm对方法区也是有垃圾收集机制的。如果单例类被收集,那么堆中的对象就会失去到根的路径,必然会被垃圾收集掉。 首先要了解jvm卸载类的时机 1、堆中不存在该类的实例对象。 2、加载该类的classLoader已经被回收。 3、该类对应的Class对象没有任何地方可以被引用,通过反射访问不到该Class对象。 三个条件全部满足的时候类才会被卸载,由于单例模式不满足第一个条件,所以单例类也不会被卸载

单例的好处:

单例可以继承类,实现接口,是面向对象的,在一些场景下方便扩展,方法可以被重写可以被延迟加载

误区:

静态方法与静态成员变量、静态代码块加载是不一样的,静态方法的加载时机和实例方法是一样的他们在性能和占用内存都是一样的。

早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。

结论:

1、没有配置信息的工具类可以使用静态类比较好,方便快捷,如果是有配置信息的工具类,还是单例模式比较好。

2、从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法,其实用两个方法在效率和性能上影响并不大。比如静态方法Math.abs()



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3