All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.openhft.chronicle.hash.serialization.StatefulCopyable Maven / Gradle / Ivy

/*
 * Copyright 2012-2018 Chronicle Map Contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.openhft.chronicle.hash.serialization;

import net.openhft.chronicle.map.ChronicleMap;
import net.openhft.chronicle.set.ChronicleSet;

/**
 * {@link Cloneable}-like interface used by Chronicle Map to populate stateful serializer
 * implementations for each isolated site (thread + Chronicle Map instance + objects domain).
 * Stateful implementations of serialization interfaces ({@link SizedReader}, {@link SizedWriter},
 * {@link BytesReader}, {@link BytesWriter} or {@link DataAccess}), configured for {@link
 * ChronicleMap} or {@link ChronicleSet} in builder, should implement the {@code StatefulCopyable}
 * interface.
 * 

*

See * Understanding {@code StatefulCopyable} section in the Chronicle Map tutorial for more info * on how to implement and use this interface properly, and for examples. * * @param the type of marshaller, implementing this interface */ public interface StatefulCopyable> { /** * Checks if {@code possiblyStatefulCopyable} implements {@code StatefulCopyable}, then returns * {@link #copy()} of it, otherwise returns the {@code possiblyStatefulCopyable} itself. * * @param possiblyStatefulCopyable the instance to {@code copy()} if it implements {@code * StatefulCopyable}, or to return without modification * @param the type of the passed instance * @return the copy of the passed instance with independent state, of the instance back, if it * doesn't implement {@code StatefulCopyable} */ static T copyIfNeeded(T possiblyStatefulCopyable) { if (possiblyStatefulCopyable instanceof StatefulCopyable) { //noinspection unchecked return (T) ((StatefulCopyable) possiblyStatefulCopyable).copy(); } return possiblyStatefulCopyable; } /** * Creates a copy of this marshaller, with independent state. The current state itself shouldn't * be copied (it could be "clear" in the copy), only "configuration" of the instance, on which * {@code copy()} is called, should be inherited in the copy (e. g. the class of objects * serialized). So, {@code copy()} should be transitive, i. e. {@code marshaller.copy()} and * {@code marshaller.copy().copy()} should result to identical instances. *

*

The state of the instance on which {@code copy()} is called shouldn't be changed. *

*

If some marshaller is ought to implement {@code StatefulCopyable} interface (e. g. * {@link DataAccess}) but is stateless actually, it could return {@code this} from this method. * * @return the copy if this marshaller with the same configuration, but independent state */ T copy(); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy