私有化构造函数强化不可实例化的类,避免创建不必要的对象(四,五)

通过私有化构造函数强化不可实例化的类

这个个人理解就是因为有默认构造函数的原因,如果是显示声明私有化的话则不可实例化,或者只能通过本身来提供实例。但是对于某些工具类,如Collections,更希望即便在内部也不要私有化,书中给出一种方案,我们一Collections类为例

1
2
3
4
// Suppresses default constructor, ensuring non-instantiability.
private Collections() {
throw new AssertionError();//可有可以无,但是有的情况下,可以有效防止内部不小心实例化
}

避免创建不必要的对象

其实鼓励能够使用单例的或者静态工厂的尽量使用,这样可以少创建无用对象,这样能减轻垃圾回收的压力,可以很好的提升性能。

1
2
3
4
String s = new String("stringette");
//这种写法会制造不必要的String实例,"stringette"本身就是一个实例,再使用new会再创建一个实例
String ss = "stringette";
//这种写法会复用一个实例,即便在多次调用的情况下,该实例被保存在字符串常量池中

可以参考下这篇文章:https://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html

优先使用基本类型,而非装箱类型,这里装箱的时候回产生新的对象。
下面这个例子测试时间分别为8483ms和775ms相差有10倍之多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.stardust.effective.role4And5;

/**
* Created by mike on 2017/12/4.
*/
public class LongTest {

public static void main(String[] args) {
long start = System.currentTimeMillis(); //获取开始时间
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
long middle = System.currentTimeMillis(); //获取中间时间
System.out.println(middle-start);



long sum2 = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum2 += i;
}
long end = System.currentTimeMillis(); //获取结束时间
System.out.println(end-middle);
}

}

分享到