Java 中的 RAII

RAII全称为Resource Acquisition Is Initialization,是一种在 C++ 中常用且实用的设计模式,主要用于安全的引用稀缺资源,并在不需要该资源的时刻释放它。

Java 中,可以用另一种方法实现:try-with-resources,可以将稀缺资源包装,实现 Closeable 接口,如下示例:

class Decoder implements Closeable {
private MediaCodec decoder;
private String mimeType;
private MediaFormat format;
private Surface outputSurface;
private Decoder(String mimeType, MediaFormat format, Surface outputSurface) {
this.mimeType = mimeType;
this.format = format;
this.outputSurface = outputSurface;
}
@Override
public void close() {
if (decoder != null) {
decoder.release();
decoder = null;
}
}
public Decoder acquire() {
this.decoder = MediaCodec.createDecoderByType(mimeType);
this.decoder.configure(format, outputSurface, null, 0);
this.decoder.start();
return this;
}
}
void render() {
// init infos
try (Decoder decoder = new Decoder(mimeType, format, surface).acquire()) {
// do decoder thing;
} // here decoder will close automatically.
}

以上代码可以看做是一种权衡之计,只适合在小范围内使用,比起 C++ 中的 RAII 灵活性查了很多,比如无法在创建后转移所有权等等,但总的来说,聊胜于无。