constructor(
		has,
		get,
		set,
		useStartTime = true,
		isSet = /** @type {U} */ (false)
	) {
		this._has = has;
		this._get = get;
		this._set = set;
		this._useStartTime = useStartTime;
		/** @type {U} */
		this._isSet = isSet;
		/** @type {Map<string, SnapshotOptimizationEntry>} */
		this._map = new Map();
		this._statItemsShared = 0;
		this._statItemsUnshared = 0;
		this._statSharedSnapshots = 0;
		this._statReusedSharedSnapshots = 0;
	}
@param {(snapshot: Snapshot) => boolean} has has value
@param {(snapshot: Snapshot) => SnapshotOptimizationValue<U, T> | undefined} get get value
@param {(snapshot: Snapshot, value: SnapshotOptimizationValue<U, T>) => void} set set value
@param {boolean=} useStartTime use the start time of snapshots
@param {U=} isSet value is an Set instead of a Map