T1 - type of the first possible valueT2 - type of the second possible valuepublic abstract class Union<T1,T2> extends UnionBase<T1,T2>
This is sometimes useful to transport errors from one part to the other, when
throwing them is no option. This is a type-safe implementation of a 2-member union
structure as defined in the C programming language.
This class allows no overriding to guarantee the following invariance:
u.has1() ^ u.has2() is always trueThere is exactly one way to construct a union of either type:
t1(Object) will construct a union which contains a value of type T1t2(Object) will construct a union which contains a value of type T2
This implementation does not allow null values.
Any consumers can safely assume that the values they achieve are non-null.
See NullableUnion if support for null is required.
It is more efficient to use the following branchless methods for handling unions instead of combinations of UnionBase.has1()/get1() and UnionBase.has2()/get2():
UnionBase.dispose(Consumer, Consumer) to handle the value wrapped in this union.
You can safely assume that both consumers will only get non-null arguments.
UnionBase.test(Predicate, Predicate) to perform a test on the values in this union.
You can safely assume that both predicates will only get non-null arguments.
UnionBase.condense(Function, Function) to combine both types of values into one common outcoming value.
You can safely assume that both functions will only get non-null arguments.
String txt = u.condense(Object::toString, Object::toString);| Modifier and Type | Method and Description |
|---|---|
abstract T1 |
get1()
Get the value if it is of type
T1. |
abstract T2 |
get2()
Get the value if it is of type
T2. |
abstract java.lang.Object |
getValue()
Get the value contained in this union.
|
static <V1,V2> Union<V1,V2> |
t1(V1 v1)
Create a union containing a value of type V1.
|
static <V1,V2> Union<V1,V2> |
t2(V2 v2)
Create a union containing a value of type V2.
|
condense, dispose, disposeFragile1, disposeFragile2, disposeOnly1, disposeOnly2, has1, has2, isEqual1, isEqual2, map, swap, test@NotNull public abstract T1 get1() throws java.lang.IllegalStateException
T1.
Throw an exception otherwise.get1 in class UnionBase<T1,T2>T1java.lang.IllegalStateException - if this union does contain a value of type T2UnionBase.has1()@NotNull public abstract T2 get2() throws java.lang.IllegalStateException
T2.
Throw an exception otherwise.get2 in class UnionBase<T1,T2>T2java.lang.IllegalStateException - if this union does contain a value of type T1UnionBase.has1()@NotNull public abstract java.lang.Object getValue()
@NotNull public static <V1,V2> Union<V1,V2> t1(@NotNull V1 v1)
V1 - value type of contained valueV2 - implicitv1 - value contained in this unionv1