package net.pterodactylus.sone.utils;
import com.google.common.base.Predicate;
/**
* Basic implementation of an {@link Option}.
*
* @param <T>
* The type of the option
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
public class DefaultOption<T> implements Option<T> {
/** The default value. */
private final T defaultValue;
/** The current value. */
private volatile T value;
/** The validator. */
private Predicate<T> validator;
/**
* Creates a new default option.
*
* @param defaultValue
* The default value of the option
*/
public DefaultOption(T defaultValue) {
this(defaultValue, null);
}
/**
* Creates a new default option.
*
* @param defaultValue
* The default value of the option
* @param validator
* The validator for value validation (may be {@code null})
*/
public DefaultOption(T defaultValue, Predicate<T> validator) {
this.defaultValue = defaultValue;
this.validator = validator;
}
/**
* {@inheritDoc}
*/
@Override
public T get() {
return (value != null) ? value : defaultValue;
}
/**
* Returns the real value of the option. This will also return an unset
* value (usually {@code null})!
*
* @return The real value of the option
*/
@Override
public T getReal() {
return value;
}
/**
* {@inheritDoc}
*/
@Override
public boolean validate(T value) {
return (validator == null) || (value == null) || validator.apply(value);
}
/**
* {@inheritDoc}
*/
@Override
public void set(T value) {
if ((value != null) && (validator != null) && (!validator.apply(value))) {
throw new IllegalArgumentException("New Value (" + value + ") could not be validated.");
}
this.value = value;
}
}