@Override
    public final LinkedPointer addEffect(AbstractEffect<Double> e) {
        if (e == null)
            throw new NullPointerException("The effect is null.");
        if (!e.affectTo().equals(type))
            throw new NullPointerException("The effect cannot affect this property.");
        lock();
        try {
            switch (e.getEffectType()) {
                case TYPE_SIMPLE:
                    return addAdditionValue(e);
                case TYPE_BUFF:
                case TYPE_BUFF_INTERVAL:
                    return addBuffEffect((BuffEffect<Double>) e);
                case TYPE_MODIFIED:
                    setFixedEffect((ModifiedEffect<Double>) e);
                    return null;
                case TYPE_LONGTIME:
                case TYPE_LONGTIME_INTERVAL:
                    return addLongTimeEffect((LongTimeEffect<Double>) e);
                default:
                    throw new ErrorTypeException("Error effect type.");
            }
        } finally {
            unlock();
        }
    }