blob: 8f690a33de4fb3a1487ac5f24ef12abf4686cc84 [file] [log] [blame]
/*
* Copyright (C) 2015 Google Inc.
*
* 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 com.google.cloud.dataflow.sdk.util.state;
import com.google.cloud.dataflow.sdk.annotations.Experimental;
import com.google.cloud.dataflow.sdk.annotations.Experimental.Kind;
/**
* A {@code StateContents} is produced by the read methods on all {@link State} objects.
* Calling {@link #read} returns the associated value.
*
* <p>This class is similar to {@link java.util.concurrent.Future}, but each invocation of
* {@link #read} need not return the same value.
*
* <p>Getting the {@code StateContents} from a read method indicates the desire to eventually
* read a value. Depending on the runner this may or may not immediately start the read.
*
* @param <T> The type of value returned by {@link #read}.
*/
@Experimental(Kind.STATE)
public interface ReadableState<T> {
/**
* Read the current value, blocking until it is available.
*
* <p>If there will be many calls to {@link #read} for different state in short succession,
* you should first call {@link #readLater} for all of them so the reads can potentially be
* batched (depending on the underlying {@link StateInternals} implementation}.
*/
T read();
/**
* Indicate that the value will be read later.
*
* <p>This allows a {@link StateInternals} implementation to start an asynchronous prefetch or
* to include this state in the next batch of reads.
*
* @return this for convenient chaining
*/
ReadableState<T> readLater();
}