6464 * read-only access to properties via {@link DataBindingPropertyAccessor}. Similarly,
6565 * {@link SimpleEvaluationContext#forReadWriteDataBinding()} enables read and write access
6666 * to properties. Alternatively, configure custom accessors via
67- * {@link SimpleEvaluationContext#forPropertyAccessors} and potentially activate method
68- * resolution and/or a type converter through the builder.
67+ * {@link SimpleEvaluationContext#forPropertyAccessors}, potentially
68+ * {@linkplain Builder#withAssignmentDisabled() disable assignment}, and optionally
69+ * activate method resolution and/or a type converter through the builder.
6970 *
7071 * <p>Note that {@code SimpleEvaluationContext} is typically not configured
7172 * with a default root object. Instead it is meant to be created once and
@@ -234,9 +235,8 @@ public Object lookupVariable(String name) {
234235 * ({@code ++}), and decrement ({@code --}) operators are disabled.
235236 * @return {@code true} if assignment is enabled; {@code false} otherwise
236237 * @since 5.3.38
237- * @see #forPropertyAccessors(PropertyAccessor...)
238238 * @see #forReadOnlyDataBinding()
239- * @see #forReadWriteDataBinding ()
239+ * @see Builder#withAssignmentDisabled ()
240240 */
241241 @ Override
242242 public boolean isAssignmentEnabled () {
@@ -245,15 +245,18 @@ public boolean isAssignmentEnabled() {
245245
246246 /**
247247 * Create a {@code SimpleEvaluationContext} for the specified {@link PropertyAccessor}
248- * delegates: typically a custom {@code PropertyAccessor} specific to a use case
249- * (e.g. attribute resolution in a custom data structure), potentially combined with
250- * a {@link DataBindingPropertyAccessor} if property dereferences are needed as well.
251- * <p>Assignment is enabled within expressions evaluated by the context created via
252- * this factory method.
248+ * delegates: typically a custom {@code PropertyAccessor} specific to a use case —
249+ * for example, for attribute resolution in a custom data structure — potentially
250+ * combined with a {@link DataBindingPropertyAccessor} if property dereferences are
251+ * needed as well.
252+ * <p>By default, assignment is enabled within expressions evaluated by the context
253+ * created via this factory method; however, assignment can be disabled via
254+ * {@link Builder#withAssignmentDisabled()}.
253255 * @param accessors the accessor delegates to use
254256 * @see DataBindingPropertyAccessor#forReadOnlyAccess()
255257 * @see DataBindingPropertyAccessor#forReadWriteAccess()
256258 * @see #isAssignmentEnabled()
259+ * @see Builder#withAssignmentDisabled()
257260 */
258261 public static Builder forPropertyAccessors (PropertyAccessor ... accessors ) {
259262 for (PropertyAccessor accessor : accessors ) {
@@ -262,7 +265,7 @@ public static Builder forPropertyAccessors(PropertyAccessor... accessors) {
262265 "ReflectivePropertyAccessor. Consider using DataBindingPropertyAccessor or a custom subclass." );
263266 }
264267 }
265- return new Builder (true , accessors );
268+ return new Builder (accessors );
266269 }
267270
268271 /**
@@ -273,22 +276,26 @@ public static Builder forPropertyAccessors(PropertyAccessor... accessors) {
273276 * @see DataBindingPropertyAccessor#forReadOnlyAccess()
274277 * @see #forPropertyAccessors
275278 * @see #isAssignmentEnabled()
279+ * @see Builder#withAssignmentDisabled()
276280 */
277281 public static Builder forReadOnlyDataBinding () {
278- return new Builder (false , DataBindingPropertyAccessor .forReadOnlyAccess ());
282+ return new Builder (DataBindingPropertyAccessor .forReadOnlyAccess ()). withAssignmentDisabled ( );
279283 }
280284
281285 /**
282286 * Create a {@code SimpleEvaluationContext} for read-write access to
283287 * public properties via {@link DataBindingPropertyAccessor}.
284- * <p>Assignment is enabled within expressions evaluated by the context created via
285- * this factory method.
288+ * <p>By default, assignment is enabled within expressions evaluated by the context
289+ * created via this factory method. Assignment can be disabled via
290+ * {@link Builder#withAssignmentDisabled()}; however, it is preferable to use
291+ * {@link #forReadOnlyDataBinding()} if you desire read-only access.
286292 * @see DataBindingPropertyAccessor#forReadWriteAccess()
287293 * @see #forPropertyAccessors
288294 * @see #isAssignmentEnabled()
295+ * @see Builder#withAssignmentDisabled()
289296 */
290297 public static Builder forReadWriteDataBinding () {
291- return new Builder (true , DataBindingPropertyAccessor .forReadWriteAccess ());
298+ return new Builder (DataBindingPropertyAccessor .forReadWriteAccess ());
292299 }
293300
294301
@@ -307,15 +314,24 @@ public static final class Builder {
307314 @ Nullable
308315 private TypedValue rootObject ;
309316
310- private final boolean assignmentEnabled ;
317+ private boolean assignmentEnabled = true ;
311318
312319
313- private Builder (boolean assignmentEnabled , PropertyAccessor ... accessors ) {
314- this .assignmentEnabled = assignmentEnabled ;
320+ private Builder (PropertyAccessor ... accessors ) {
315321 this .accessors = Arrays .asList (accessors );
316322 }
317323
318324
325+ /**
326+ * Disable assignment within expressions evaluated by this evaluation context.
327+ * @since 5.3.38
328+ * @see SimpleEvaluationContext#isAssignmentEnabled()
329+ */
330+ public Builder withAssignmentDisabled () {
331+ this .assignmentEnabled = false ;
332+ return this ;
333+ }
334+
319335 /**
320336 * Register the specified {@link MethodResolver} delegates for
321337 * a combination of property access and method resolution.
@@ -347,7 +363,6 @@ public Builder withInstanceMethods() {
347363 return this ;
348364 }
349365
350-
351366 /**
352367 * Register a custom {@link ConversionService}.
353368 * <p>By default a {@link StandardTypeConverter} backed by a
@@ -359,6 +374,7 @@ public Builder withConversionService(ConversionService conversionService) {
359374 this .typeConverter = new StandardTypeConverter (conversionService );
360375 return this ;
361376 }
377+
362378 /**
363379 * Register a custom {@link TypeConverter}.
364380 * <p>By default a {@link StandardTypeConverter} backed by a
0 commit comments