package java.lang;

/**
 * A resource that must be closed when it is no longer needed.
 */
public interface AutoCloseable {
	/**
	 * Closes this resource, relinquishing any underlying resources. This method is invoked
	 * automatically on objects managed by the {@code try}-with-resources statement.
	 *
	 * <p>
	 * While this interface method is declared to throw {@code Exception}, implementers are
	 * <em>strongly</em> encouraged to declare concrete implementations of the {@code close} method to
	 * throw more specific exceptions, or to throw no exception at all if the close operation cannot
	 * fail.
	 *
	 * <p>
	 * <em>Implementers of this interface are also strongly advised to not have the {@code close} method
	 * throw {@link InterruptedException}.</em>
	 *
	 * This exception interacts with a thread's interrupted status.
	 *
	 * <p>
	 * Note that unlike the {@link java.io.Closeable#close close} method of {@link java.io.Closeable},
	 * this {@code close} method is <em>not</em> required to be idempotent. In other words, calling this
	 * {@code close} method more than once may have some visible side effect, unlike
	 * {@code Closeable.close} which is required to have no effect if called more than once.
	 *
	 * However, implementers of this interface are strongly encouraged to make their {@code close}
	 * methods idempotent.
	 *
	 * @throws Exception
	 *         if this resource cannot be closed
	 */
	void close() throws Exception;
}
