Class ValueBuilder<T>
- java.lang.Object
-
- net.groboclown.retval.ValueBuilder<T>
-
- All Implemented Interfaces:
ProblemContainer
public class ValueBuilder<T> extends java.lang.Object implements ProblemContainer
Contains a non-null value and accumulates problems as aspects of the value are updated.This class is commonly used to track problems associated with the gradual construction of a value, and keep track of all problems discovered. Care must be taken to ensure proper "then" logic if one value depends on another (say, to get the stored email, the user ID must be known, but the user ID must be valid).
-
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description java.util.Collection<Problem>anyProblems()Return all the problems in this object, even if the container is "ok".WarningVal<T>asWarning()Create a warning version of this builder.java.lang.StringdebugProblems(java.lang.String joinedWith)Return the problems as a single string, which combines theObject.toString()output of each problem with the given joining string parameter.RetVal<T>evaluate()Convert this builder into aRetVal; if any problems exist, then the returned object will have those problems, otherwise it will contain the value.static <T> ValueBuilder<T>from(T value)Construct a new value builder for the given initial state of the value.ProblemCollectorgetCollector()Get the underlying problem collector.TgetValue()Get the value stored in this builder.booleanhasProblems()Returns whether this object contains 1 or more problems.booleanisOk()Returns whether this object contains zero problems.booleanisProblem()Returns whether this object contains 1 or more problems.voidjoinProblemsWith(java.util.Collection<Problem> problemList)Add all problems in this container into the argument.RetVal<T>then()Convert this builder into aRetVal; if any problems exist, then the returned object will have those problems, otherwise it will contain the value.java.util.Collection<Problem>validProblems()Returns all contained problems in this object, but only if this object contains 1 or more problems.<V> ValueBuilder<T>with(RetNullable<V> arg, NonnullFirstBiConsumer<T,V> consumer)Calls the consumer with arguments(getValue(), arg.result())if arg has no problems.<V> ValueBuilder<T>with(RetVal<V> arg, NonnullBiConsumer<T,V> consumer)Calls the consumer with arguments(getValue(), arg.result())if arg has no problems.ValueBuilder<T>with(RetVoid problems)Join any problems in the argument with this builder.ValueBuilder<T>withValue(NonnullConsumer<T> consumer)Call the consumer with the current value; commonly used to set a single, no-problem attribute on the value.
-
-
-
Method Detail
-
from
@Nonnull public static <T> ValueBuilder<T> from(@Nonnull T value)
Construct a new value builder for the given initial state of the value.- Type Parameters:
T- type of the value- Parameters:
value- source value- Returns:
- the new builder.
-
getValue
@Nonnull public T getValue()
Get the value stored in this builder.- Returns:
- the stored value.
-
evaluate
@Nonnull public RetVal<T> evaluate()
Convert this builder into aRetVal; if any problems exist, then the returned object will have those problems, otherwise it will contain the value.- Returns:
- the value or problems.
-
then
@Nonnull public RetVal<T> then()
Convert this builder into aRetVal; if any problems exist, then the returned object will have those problems, otherwise it will contain the value.Identical to
evaluate(); used for symmetry with the other Ret classes. However, this can lead to usage confusion and cluttered reading of the code.- Returns:
- the value or problems.
-
asWarning
@Nonnull public WarningVal<T> asWarning()
Create a warning version of this builder.- Returns:
- the value + all problems
-
with
@Nonnull public <V> ValueBuilder<T> with(@Nonnull RetVal<V> arg, @Nonnull NonnullBiConsumer<T,V> consumer)
Calls the consumer with arguments(getValue(), arg.result())if arg has no problems. This ignores the current problem state of the builder.Used to set or update the value stored by this builder based on a problematic value.
- Type Parameters:
V- type of the argument- Parameters:
arg- a new parameter to include in the built value.consumer- updates the built value with the value of the parameter.- Returns:
- this builder
-
with
@Nonnull public <V> ValueBuilder<T> with(@Nonnull RetNullable<V> arg, @Nonnull NonnullFirstBiConsumer<T,V> consumer)
Calls the consumer with arguments(getValue(), arg.result())if arg has no problems. This ignores the current problem state of the builder.Used to set or update the value stored by this builder based on a problematic value.
- Type Parameters:
V- type of the argument- Parameters:
arg- a new parameter to include in the built value.consumer- updates the built value with the value of the parameter.- Returns:
- this builder
-
with
@Nonnull public ValueBuilder<T> with(@Nonnull RetVoid problems)
Join any problems in the argument with this builder.This commonly has use when another process builds values that are not directly set in the caller. For example, if the built value has a final value that is populated elsewhere, its problems will need to be included here.
- Parameters:
problems- possible problem-contained non-value.- Returns:
- this instance.
-
withValue
@Nonnull public ValueBuilder<T> withValue(@Nonnull NonnullConsumer<T> consumer)
Call the consumer with the current value; commonly used to set a single, no-problem attribute on the value. Provided for symmetry with the other "with" calls.A common use case is to have the builder method return the value builder without intermediate steps. This method allows for chained calls to flow fluently:
RetVal<StringBuilder> create() { return ValueBuilder.from(new StringBuilder("Name: ")) .with(discoverName(), StringBuilder::append) .withValue((sb) -> sb.append("; Age: ")) .with(discoverAge(), StringBuilder::append) .then(); }- Parameters:
consumer- accepts the value- Returns:
- this instance.
-
getCollector
@Nonnull public ProblemCollector getCollector()
Get the underlying problem collector. This contains all the problems discovered so far.- Returns:
- the problem collector.
-
isProblem
public boolean isProblem()
Description copied from interface:ProblemContainerReturns whether this object contains 1 or more problems.- Specified by:
isProblemin interfaceProblemContainer- Returns:
- true if there is a problem, false if there is no problem.
-
hasProblems
public boolean hasProblems()
Description copied from interface:ProblemContainerReturns whether this object contains 1 or more problems. Duplicate ofProblemContainer.isProblem()for English readability.- Specified by:
hasProblemsin interfaceProblemContainer- Returns:
- true if there is a problem, false if there is no problem.
-
isOk
public boolean isOk()
Description copied from interface:ProblemContainerReturns whether this object contains zero problems.- Specified by:
isOkin interfaceProblemContainer- Returns:
- true if there are no problems, false if there is a problem.
-
anyProblems
@Nonnull public java.util.Collection<Problem> anyProblems()
Description copied from interface:ProblemContainerReturn all the problems in this object, even if the container is "ok".Generally, this combines the problems in this instance with a larger collection, which can itself be used to check if any of the values had problems.
The returned collection is read-only, and contains no null values.
- Specified by:
anyProblemsin interfaceProblemContainer- Returns:
- the problems contained in this container, even if there are none.
-
validProblems
@Nonnull public java.util.Collection<Problem> validProblems()
Description copied from interface:ProblemContainerReturns all contained problems in this object, but only if this object contains 1 or more problems. If it contains 0, then this throws anIllegalStateException.The returned collection is read-only, and contains no null values.
- Specified by:
validProblemsin interfaceProblemContainer- Returns:
- the problems in this container, and the collection will contain at least 1 item.
-
debugProblems
@Nonnull public java.lang.String debugProblems(@Nonnull java.lang.String joinedWith)Description copied from interface:ProblemContainerReturn the problems as a single string, which combines theObject.toString()output of each problem with the given joining string parameter. If this object contains no problems, then an empty string is returned instead.- Specified by:
debugProblemsin interfaceProblemContainer- Parameters:
joinedWith- the text to join multiple problem strings together.- Returns:
- the combined text of the problems, or an empty string if there are no problems.
-
joinProblemsWith
public void joinProblemsWith(@Nonnull java.util.Collection<Problem> problemList)Description copied from interface:ProblemContainerAdd all problems in this container into the argument. This has a very specific usage to indicate that this container, even if it has no problems, is part of a bigger issue. Therefore, this is fine to call even if there are no problems in this container.- Specified by:
joinProblemsWithin interfaceProblemContainer- Parameters:
problemList- a modifiable collection of zero or more problems.
-
-