blob: e23437a69830f0640742b1763e502051448e0806 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.lifetime;
/**
* Utility class that help ensure destruction of objects happens only once.
*
* This class does not guarantee thread safety. When thread safety is desired, please use
* {@see org.chromium.base.ThreadUtils.ThreadChecker}.
*
* To use:
* 1. In constructor of an instance a DestroyChecker field should be initialized with a new
* DestroyChecker.
* 2. All of the methods that need to ensure that the object is used safely, should call
* {@link #checkNotDestroyed()} to make sure that DestroyChecker hasn't been destroyed.
* 3. When the guarded object is destroyed, it should be enough to call {@link #destroy()} on the
* DestroyChecker. That operation is not idempotent, and it asserts the state of the checker.
* It is therefore not necessary to call {@link #checkNotDestroyed()} in that case. It is also
* not allowed to call {@link #destroy()} more than once.
*/
public class DestroyChecker implements Destroyable {
private boolean mIsDestroyed;
@Override
public void destroy() {
checkNotDestroyed();
mIsDestroyed = true;
}
/** Returns whether the checker is already destroyed. */
public boolean isDestroyed() {
return mIsDestroyed;
}
/** Checks whether the object is already destroyed and asserts if it is. */
public void checkNotDestroyed() {
assert !mIsDestroyed : "Object is already destroyed.";
}
}