S - the state typeI - the input typeO - the output typepublic interface ObservableSUL<S,I,O> extends SUL<I,O>
| Modifier and Type | Method and Description |
|---|---|
default boolean |
deepCopies()
Returns whether each state retrieved with
getState() is a deep copy. |
default ObservableSUL<S,I,O> |
fork()
Forks this SUL, if possible.
|
S |
getState()
Returns the current state of the system.
|
default ObservableSUL<S,I,O> fork()
SULSUL.pre() and
SUL.post().
If SUL.canFork() returns true, this method must return a non-null object, which should
behave exactly like this SUL (in particular, it must be forkable as well). Otherwise, a UnsupportedOperationException must be thrown.
Implementation note: if resetting a SUL changes the internal state of this object in a non-trivial way (e.g., incrementing a counter to ensure independent sessions), care must be taken that forks of this SUL manipulate the same internal state.
S getState()
Object.equals(Object)
method, and a good Object.hashCode() function.default boolean deepCopies()
getState() is a deep copy.
A state is a deep copy if calls to either SUL.step(Object), SUL.pre(), or SUL.post() do not modify
any state previously obtained with getState().
More formally (assuming a perfect hash function): the result must be false if there is a case where in the
following statements the assertion does not hold:
Object o = getState(); int hc = o.hashCode(); [step(...)|pre()|post()]; assert o.hashCode() == hc;
Furthermore, if states can be retrieved, but each state is not a deep copy, then this SUL must be
forkable, i.e. if !deepCopies() then SUL.canFork() must hold.Copyright © 2020. All rights reserved.