Effective Java 创建和销毁对象("Java高效编程:对象的创建与销毁技巧")
原创
一、对象的创建
在Java编程中,对象的创建是一个非常重要的过程。合理的创建对象可以节约程序的性能和可维护性。以下是一些涉及对象创建的技巧。
1. 使用静态工厂方法代替构造器
静态工厂方法是一种替代构造器创建对象的方法,它有几个优点:
- 它们提供了更灵活的创建对象的方案,可以返回对象的子类型。
- 它们可以返回一个预先构建的对象,而不是每次调用时都创建一个新对象。
- 它们可以控制对象的创建过程,例如防止创建重复对象。
以下是一个静态工厂方法的示例:
public class IntegerCache {
private static final Integer[] cache = new Integer[256];
static {
for (int i = 0; i < cache.length; i++) {
cache[i] = i;
}
}
public static Integer valueOf(int i) {
if (i >= Integer.MIN_VALUE && i <= Integer.MAX_VALUE) {
if (i >= 0 && i < cache.length) {
return cache[i];
}
}
return new Integer(i);
}
}
2. 构造器重载
构造器重载是一种在一个类中提供多个构造器的方法,使可以以不同的方案创建对象。这有助于节约代码的可读性和可维护性。
以下是一个构造器重载的示例:
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0, 0, 0, 0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
this.sodium = sodium;
this.carbohydrate = carbohydrate;
}
}
二、对象的销毁
对象的销毁是Java内存管理的一个重要方面。合理地管理对象的销毁可以节约程序的性能和稳定性。
1. 使用 finalize() 方法清理资源
finalize() 方法是Java中用于清理资源的一种方法。当一个对象不再被引用时,垃圾回收器会自动调用它的 finalize() 方法。然而,finalize() 方法的使用需要谨慎,基于它大概会带来一些问题,例如:
- finalize() 方法执行的时间不确定,基于它依存于垃圾回收器的行为。
- finalize() 方法大概会被多次调用,基于它无法保证对象只被回收一次。
以下是一个使用 finalize() 方法清理资源的示例:
public class Resource {
private final File file;
public Resource(String filename) throws IOException {
file = new File(filename);
file.createNewFile();
}
@Override
protected void finalize() throws Throwable {
file.delete();
super.finalize();
}
}
2. 使用 try-with-resources 语句自动关闭资源
Java 7 引入了 try-with-resources 语句,它可以自动关闭实现了 AutoCloseable 或 Closeable 接口的资源。这种方案简化了资源管理,并降低了不正确。
以下是一个使用 try-with-resources 语句的示例:
public class Resource {
private final File file;
public Resource(String filename) throws IOException {
file = new File(filename);
file.createNewFile();
}
public void useResource() throws IOException {
try (FileInputStream in = new FileInputStream(file)) {
// 使用资源
}
}
}
三、其他技巧
1. 避免创建不必要的对象
创建对象是一个耗时操作,所以应尽量避免创建不必要的对象。以下是一些降低对象创建的方法:
- 使用基本类型而不是包装类型,例如使用 int 而不是 Integer。
- 重用对象而不是每次需要时都创建新对象。
- 使用 StringBuilder 或 StringBuffer 替代 String 进行字符串操作。
2. 对象池
对象池是一种管理对象创建和销毁的技术,它通过重用对象来降低创建和销毁对象的次数。对象池通常用于管理资源密集型的对象,如数据库连接和线程。
以下是一个简洁的对象池实现:
public class ObjectPool
{ private final LinkedList
pool = new LinkedList<>(); private final Supplier
factory; public ObjectPool(Supplier
factory) { this.factory = factory;
}
public T acquire() {
if (pool.isEmpty()) {
return factory.get();
} else {
return pool.removeFirst();
}
}
public void release(T t) {
pool.addLast(t);
}
}
总结
在Java编程中,对象的创建和销毁是程序性能和内存管理的关键因素。通过合理地创建和销毁对象,我们可以节约程序的性能、稳定性和可维护性。本文介绍了一些涉及对象创建和销毁的技巧,包括使用静态工厂方法、构造器重载、finalize() 方法、try-with-resources 语句、避免创建不必要的对象以及对象池等。掌握这些技巧,将有助于编写更高效、更稳定的Java程序。