Decide methods for the Java SDK
Overview of the decide methods which you can use to return a flag decision for a user in Optimizely Feature Experimentation.
Use the decide methods to return feature flag decisions for a user. Each decision includes whether the flag is enabled and which variation the user receives.
Decide
Returns a decision for a specific feature flag and user.
Minimum SDK version – v3.8+
Description
The decide method handles the variation decision for an individual experiment. It returns a decision result for a flag key for a user in an OptimizelyDecision
object and contains the data required to deliver the flag rule.
This method ensures that Feature Experimentation properly buckets the user in experiment analytics, and you should use it if there is no need for pre-rendering decisions.
Note
Decide is a method of the UserContext object. See OptimizelyUserContext for details.
See OptimizelyDecision
for details of the returned decision object.
Key features
- Single experiment decision – Returns the variation for a specific experiment.
- Bucketing in results – Ensures Feature Experimentation records the user in the experiment results page for proper analysis.
- Complement to decide all method – If you use the decide all method to pre-fetch variations, you should also call the decide method for each experiment that the user interacts with. This dual approach guarantees that Feature Experimentation accurately tracks the user's participation and that the correct variation is served through caching.
Parameters
The following table describes the parameters for the decide method:
Parameter | Type | Description |
---|---|---|
flagKey | String | The key of the feature flag |
options (optional) | Array | An array of OptimizelyDecideOption enums. |
Returns
The decide method returns an OptimizelyDecision
object.
If the method encounters a critical error (for example, SDK not ready or invalid flag key), then it returns a decision with a null
variationKey
field and populates the Reasons
field with error messages (regardless of the OptimizelyDecideOption.INCLUDE_REASONS
option).
Example decide
decide
// Create the user and decide which flag rule and variation they bucket into
Map<String, Object> attributes = new HashMap<>();
attributes.put("logged_in", true);
OptimizelyUserContext user = optimizely.createUserContext(userId, attributes);
OptimizelyDecision decision = user.decide("product_sort");
// The variation key. If null, decision fail with a critical error.
String variationKey = decision.getVariationKey();
// The flag enabled state
boolean enabled = decision.getEnabled();
// All variable values
OptimizelyJSON variables = decision.getVariables();
// String variable value
String vs = null;
try {
vs = variables.getValue("sort_method", String.class);
} catch (JsonParseException e) {
e.printStackTrace();
}
// An alternative way to access a variable value
Boolean vb = (Boolean) variables.toMap().get("k_boolean");
// Flag key for which for which decision was made
String flagKey = decision.getFlagKey();
// A copy of the user context for which the decision was made
OptimizelyUserContext userContext = decision.getUserContext();
// Reasons for the decision
List<String> reasons = decision.getReasons();
Side Effect
Invokes the decision notification listener if this listener is enabled.
Decide all
Returns decisions for all active (unarchived) flags for a user.
Minimum SDK version – v3.8+
Description
Use the decide all method to retrieve decisions for all active flags before rendering content. This is particularly useful when you need to serve the correct cached version of your page or component based on the user's variation. For example when using an edge worker or cloud function.
Key features
- Pre-rendering decision – Lets you know all variation assignments ahead of time.
- Cache control – Lets you serve the correct cached content based on the user's pre-determined variations.
- Delay experiment tracking – Use
DISABLE_DECISION_EVENT
to prevent the SDK from recording a decision before the user sees the feature. This ensures that participation is only tracked when the experience is delivered.
Parameters
The following table describes the parameters for the decide all method:
Parameter | Type | Description |
---|---|---|
options (optional) | Array | Array of OptimizelyDecideOption enums. |
Returns
The decide all method returns a map of OptimizelyDecision
objects. For more information, see OptimizelyDecision
.
If the method fails for all flags (for example, the SDK is not ready or the user context is invalid), it returns an empty map. If the method detects an error for a specific flag, it returns error messages in the Reasons
field of the decision for that flag.
Example decideAll
decideAll
import com.optimizely.ab.optimizelydecision.OptimizelyDecideOption;
// Make decisions for all active (unarchived) flags in the project for a user
List<OptimizelyDecideOption> options = Arrays.asList(OptimizelyDecideOption.ENABLED_FLAGS_ONLY);
Map<String, OptimizelyDecision> decisions = user.decideAll(options);
Set<String> allKeys = decisions.keySet();
OptimizelyDecision decisionForFlag1 = decisions.get("flag_1");
Side effect
Invokes the decision notification listener for each decision if this listener is enabled.
Decide for keys
Returns a map of flag decisions for specified flag keys.
Minimum SDK version – v3.8+
Description
Returns a map of decisions for the specified flag keys.
Parameters
The following table describes the parameters for the decide for keys method:
Parameter | Type | Description |
---|---|---|
keys | Array | Array of string flag keys. |
options (optional) | Array | Array of OptimizelyDecideOption enums. |
Returns
Returns a map of OptimizelyDecision
.
If the method fails for all flags (for example, the SDK is not ready or the user context is invalid), it returns an empty map. If the method detects an error for a specific flag, it returns error messages in the Reasons
field of the decision for that flag.
Example decideForKeys
decideForKeys
// Make decisions for specific flags
List<String> keys = Arrays.asList("flag-1", "flag-2");
Map<String, OptimizelyDecision> decisions = user.decideForKeys(keys);
OptimizelyDecision decision1 = decisions.get("flag-1");
OptimizelyDecision decision2 = decisions.get("flag-2");
Side effect
Invokes the decision notification listener for each decision if this listener is enabled.
OptimizelyDecideOption
OptimizelyDecideOption
The following table lists the OptimizelyDecideOption
enum with an explanation what happens if you set them. In addition to setting these options individually for a decide method, you can also set them as global defaults when you instantiate the Optimizely client. See Initialize the Java SDK.
OptimizelyDecideOption enum | If set |
---|---|
OptimizelyDecideOption.DISABLE_DECISION_EVENT | Prevents the SDK from dispatching an impression event when serving a variation. This disables decision tracking on the Optimizely Experiment Results page and the decision notification listener. |
OptimizelyDecideOption.ENABLED_FLAGS_ONLY | Returns decisions only for flags that are currently enabled. Used with the decide all method and decide for keys method. When this option is not set, the Android SDK returns all decisions regardless of whether the flag is enabled. |
OptimizelyDecideOption.IGNORE_USER_PROFILE_SERVICE | Bypasses the user profile service (both lookup and save) for the decision. When this option is not set, user profile service overrides audience targeting, traffic allocation, and experiment mutual exclusion groups. |
OptimizelyDecideOption.INCLUDE_REASONS | Adds log messages to the reasons field of the decision. Critical errors are always returned, even if this option is not set. |
OptimizelyDecideOption.EXCLUDE_VARIABLES | Excludes flag variable values from the decision result. Use this option to minimize the returned decision by skipping large JSON variables. |
The following code sample shows how to implement the OptimizelyDecideOption
as a global default and locally in a decide method call.
// Set global default decide options when initializing the client
ProjectConfigManager configManager = HttpProjectConfigManager.builder()
.withSdkKey(sdkKey)
.build();
List<OptimizelyDecideOption> options = Arrays.asList(OptimizelyDecideOption.DISABLE_DECISION_EVENT);
Optimizely optimizely = Optimizely.builder()
.withConfigManager(configManager)
.withDefaultDecideOptions(options)
.build();
// Set additional options in a decide call
OptimizelyUserContext user = optimizely.createUserContext("user123");
List<OptimizelyDecideOption> options = Arrays.asList(OptimizelyDecideOption.ENABLED_FLAGS_ONLY, OptimizelyDecideOption.DISABLE_DECISION_EVENT);
Map<String, OptimizelyDecision> decisions = user.decideAll(options);
Source files
The language and platform source files containing the implementation for Java are available on GitHub.
Updated 3 days ago