API- Java 9s Cleaner, , , PhantomReference, , . , static. , .. Cleanable, , , clear() clean() :
public class Cleaner {
public interface Cleanable {
void clean();
}
public static Cleanable register(Object o, Runnable r) {
CleanerReference c = new CleanerReference(
Objects.requireNonNull(o), Objects.requireNonNull(r));
phantomReferences.add(c);
return c;
}
private static final Set<CleanerReference> phantomReferences
= ConcurrentHashMap.newKeySet();
private static final ReferenceQueue<Object> garbageCollectedObjectsQueue
= new ReferenceQueue<>();
static final class CleanerReference extends PhantomReference<Object>
implements Cleanable {
private final Runnable cleaningAction;
CleanerReference(Object referent, Runnable action) {
super(referent, garbageCollectedObjectsQueue);
cleaningAction = action;
}
public void clean() {
if(phantomReferences.remove(this)) {
super.clear();
cleaningAction.run();
}
}
}
public static void deleteOrphanedNativePeerObjects() {
CleanerReference reference;
while((reference=(CleanerReference)garbageCollectedObjectsQueue.poll()) != null) {
reference.clean();
}
}
}
Java 8; ConcurrentHashMap.newKeySet() , Collections.newSetFromMap(new ConcurrentHashMap<CleanerReference,Boolean>()).
deleteOrphanedNativePeerObjects(), , , , , , .
Runnable , Cleanable , , , .
public class WorkViewModel extends BaseObservable implements AutoCloseable
{
private long _nativeHandle;
Cleaner.Cleanable cleanable;
public WorkViewModel(Database database, int workId)
{
_nativeHandle = create(database.getNativeHandle(), workId);
cleanable = createCleanable(this, _nativeHandle);
}
private static Cleaner.Cleanable createCleanable(Object o, long _nativeHandle) {
return Cleaner.register(o, () -> delete(_nativeHandle));
}
@Override
public void close() {
cleanable.clean();
}
private static native long create(long databaseHandle, int workId);
static native void delete(long nativeHandle);
@Bindable
public native int getWorkId();
public native void setWorkId(int workId);
}
AutoCloseable, try -with-resources, close() , . , , phantom Set , , . close() , .
, , , .
- , Runnable ; , phantom. , this, static . this , . Object, .