先看我们一个用户端的代码:
public class RecycleTest {
private static final Recycler<User> RECYCLER = new Recycler<User>() {
@Override
protected User newObject(Handle<User> handle) {
return new User(handle);
}
};
private static class User {
private final Recycler.Handle<User> handle;
public User(Recycler.Handle<User> handle) {
this.handle = handle;
}
public void recycle() {
handle.recycle(this);
}
}
public static void main(String[] args) {
User user = RECYCLER.get();
user.recycle();
RECYCLER.get().recycle();
User user1 = RECYCLER.get();
System.out.println(user1 == user);
}
}
在User的构造函数里面,传进去了一个handle,这个handle负责回收对象的。
我们获取对象也不从User那里new 出来,直接使用Recycler的get方法。
get出来之后,user多次回收,但是user1和user还是同一个对象,得出来的结果是:
我们可以看看之前我们学习过的PooledDirectByteBuf的源码:
final class PooledDirectByteBuf extends PooledByteBuf<ByteBuffer> {
private static final Recycler<PooledDirectByteBuf> RECYCLER = new Recycler<PooledDirectByteBuf>() {
@Override
protected PooledDirectByteBuf newObject(Handle<PooledDirectByteBuf> handle) {
return new PooledDirectByteBuf(handle, 0);
}
};
static PooledDirectByteBuf newInstance(int maxCapacity) {
PooledDirectByteBuf buf = RECYCLER.get();
buf.reuse(maxCapacity);
return buf;
}
和我们的User大同小异,也是把handle传进去,然后通过这个RECYCLER的get方法获取对象。不过这里是又封装了一层,通过newInstance获取对象,同时也可以调用reuse初始化以下对象。