CloserImpl.java

package io.github.jonloucks.contracts.impl;

import io.github.jonloucks.contracts.api.AutoClose;

import java.util.concurrent.atomic.AtomicReference;

final class CloserImpl {
    CloserImpl() {
    
    }
    
    void close() {
        final AutoClose close = reference.get();
        if (close != null && reference.compareAndSet(close, null)) {
            close.close();
        }
    }
    
    void set(AutoClose autoClose) {
        if (autoClose == reference.get()) {
            return;
        }
        try {
            close();
        } finally {
            reference.set(autoClose);
        }
    }
    
    private final AtomicReference<AutoClose> reference = new AtomicReference<>();
}