item6 · 避免创建不必要的对象
例子
String s = new String("abcd"); // DON'T DO THIS!
-
上述语句每次被执行的时候都创建一个新的
String
示例,但是这些创建对象的动作全都是不必要的。传递给String
构造器的参数("abcd")
本身就是一个String
实例。 -
改进后的版本如下所示:
String s = "abcd";
-
这个版本只用了一个
String
实例,而不是每次执行的时候都创建一个新的实例。而且,对于在同一虚拟机中运行的代码,只要它们包含的字符串字面常量,该对象就会被重用。(运行时常量池)
优先使用静态工厂
-
对于同时提供静态工厂方法(见Item1)和构造器的不可变类,通常优先使用静态工厂方法而不是构造器,以避免创建不必要的对象。
-
例:
/** * Allocates a {@code Boolean} object representing the value * {@code true} if the string argument is not {@code null} * and is equal, ignoring case, to the string {@code "true"}. * Otherwise, allocates a {@code Boolean} object representing the * value {@code false}. * * @param s the string to be converted to a {@code Boolean}. * * @deprecated * It is rarely appropriate to use this constructor. * Use {@link #parseBoolean(String)} to convert a string to a * {@code boolean} primitive, or use {@link #valueOf(String)} * to convert a string to a {@code Boolean} object. */ @Deprecated(since="9") public Boolean(String s) { this(parseBoolean(s)); }
/** * Returns a {@code Boolean} with a value represented by the * specified string. The {@code Boolean} returned represents a * true value if the string argument is not {@code null} * and is equal, ignoring case, to the string {@code "true"}. * Otherwise, a false value is returned, including for a null * argument. * * @param s a string. * @return the {@code Boolean} value represented by the string. */ public static Boolean valueOf(String s) { return parseBoolean(s) ? TRUE : FALSE; }
对于静态工厂方法
Boolean.valueOf ( String )
几乎总是优于构造器Boolean ( String )
注:
Boolean ( String )
在 Java 9 中已经被废弃了。
适当使用自动装箱
- 在大量数学计算时优先使用基本类型
- 但对于可提升程序的清晰性、简洁性和功能性时不要刻意避免创建对象
需要考虑安全性时提倡使用保护性拷贝
- 见第50条