假设您有一个实现Car
的{{1}}类。构造函数采用AutoCloseable
对象,该对象在汽车关闭时需要停止。
Engine
class Car implements AutoCloseable
{
final Engine engine;
Car(final Engine engine)
{
this.engine = engine;
}
@Override
public void close()
{
engine.stop();
}
}
首先初始化一个引擎,然后使用它来构造一辆新车。
CarFactory
确保在try-with-resources语句中将汽车关闭。
class CarFactory
{
public Car createCar()
{
// Initialize resources
final Engine engine = new Engine();
engine.start();
// Pass them to a closeable object
return new Car(engine);
}
}
但是如果try (final Car car = carFactory.createCar())
{
// drive around
}
引发异常怎么办?然后工厂调用永远不会完成,引擎不会停止,因此它占用的资源也不会释放。
现在,我通常的解决方法是将整个初始化逻辑移出工厂方法,并移入try-with-resources块:
Engine#start()
class CarFactory
{
public Car createCar()
{
return new Car(new Engine());
}
}
但是,这导致了很多重复的代码,尤其是当不同的汽车实现共享相似的初始化逻辑时。除此之外,还感觉不对。我希望初始化会在工厂进行。您能帮我找到一个更好的解决方案吗?