首页 > 代码库 > 1、避免创建不必要的对象

1、避免创建不必要的对象

一般来说,最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象。

1、去除重复创建的字符串实例

1 String s = new String("china");
2 // "china"本身就是一个String的实例对象,通过new String("china");构造器方式又创建对象。等于说,这里创建了两次。如果在一个循环当中,这里一行代码将创建成千上万多余的实例。
1 String s= "china";
2 // 这里只创建了一次实例,同时,由于JVM的字符串常量池的机制,相同字面量的字符串实例会被重复使用,去除了大量多余创建。

2、同时提供了静态工厂方法和构造器的不可变类,优先使用静态工厂方法。

构造器使用一次就会创建一个对象,静态工厂方法将会通过一些机制复用对象,如果两者都提供的时候,自然优先考虑使用静态工厂方法。

3、使用静态初始化器

1 class Person{
2     private static final String name;
3     static{ // 这里使用静态域初始化数据
4         name = "lay";
5     }
6     public static String getName(){
7         return name;    // 每次都获取同一个实例
8     }                                    
9 }

4、优先使用基本数据类型而不是装箱,当心无意识自动装箱

Integer i = 100;
// 100是基本数据类型,而Interger是对象类型,这里相当于通过Integer的构造器实例化了一个对象。
// 如果在一个运算的循环当中使用了对象类型,那么自动装箱拆箱就会导致实例化指数个多余的实例,这是相当可怕的

就如最简单的单例模式一样,我们试图把对象进行复用来降低内存频繁地消耗,但并不意味着我们在所有地方都要避免创建对象。

如果是简单对象,可以提升程序的清晰性、简洁性、功能性,何乐而不为呢?况且简单对象的创建和回收代价也不高,尤其对现代的JVM来说。

那我们应当在什么时候使用呢?

例如像数据库连接池这样复杂的对象,重用这些对象具有很大的意义,那么我们应当使用。此外,我们应当避免创建多余的对象,如“去除重复创建的字符串实例”。

最后,还需要考虑的一个因素是,你复用的对象是否可变,如果变化非常频繁的话,那复用的时候就需要考虑更复杂的设计,或者不复用。

1、避免创建不必要的对象