If Martijn needs this, I'd prefer just to add another factory method:

    /**
     * Create a read-only {@link LambdaModel}. Usage:
     * <pre>
     * {@code
     *     LambdaModel.of(person::getName)
     * }
     * </pre>
     *
     * @param getter used to get value
     * @return model
     *
     * @param <T> model object type
     */
    public static <T> IModel<T> of(SerializableSupplier<T> getter)
    {
return new LambdaModel<>(getter, (t) -> { throw new UnsupportedOperationException(); });
    }

And the setter should throw the exception.

Have fun
Sven



Am 10.11.2016 um 21:34 schrieb Martin Grigorov:
I think there is no need of this change.
But if others believe it's needed then #setObject should throw an exception
as in IModel.

On Nov 10, 2016 10:24 PM, "Martijn Dashorst" <[email protected]>
wrote:

So are we pro/against expanding LambdaModel for support of a read only
variant?

Reasons against:
  - not necessary with IModel as a functional interface
  - multiple ways to do things

Reasons pro:
  - IModel version may not be as clear as a Lambda model
  - IModel version may not be as obvious a choice (years of experience
with Java < 8 and Wicket < 8)

Proposed patch:

diff --git a/wicket-core/src/main/java/org/apache/wicket/model/
LambdaModel.java
b/wicket-core/src/main/java/org/apache/wicket/model/LambdaModel.java
index 8fb9d6a..ece4fe5 100644
--- a/wicket-core/src/main/java/org/apache/wicket/model/LambdaModel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/model/LambdaModel.java
@@ -53,6 +53,19 @@ public class LambdaModel<T> implements IModel<T>
   this.setter = Args.notNull(setter, "setter");
   }

+ /**
+ * Construct the model, using the given supplier and consumer as
+ * implementation for getObject and setObject.
+ *
+ * @param getter Used for the getObject() method.
+ * @param setter Used for the setObject(T object) method.
+ */
+ public LambdaModel(SerializableSupplier<T> getter)
+ {
+ this.getter = Args.notNull(getter, "getter");
+ this.setter = null;
+ }
+
   @Override
   public T getObject()
   {
@@ -62,7 +75,8 @@ public class LambdaModel<T> implements IModel<T>
   @Override
   public void setObject(T t)
   {
- setter.accept(t);
+ if(setter != null)
+ setter.accept(t);
   }

   @Override
@@ -114,6 +128,24 @@ public class LambdaModel<T> implements IModel<T>
   }

   /**
+ * Create a read only {@link LambdaModel}. Usage:
+ * <pre>
+ * {@code
+ * LambdaModel.of(person::getName)
+ * }
+ * </pre>
+ *
+ * @param getter used to get value
+ * @return model
+ *
+ * @param <T> model object type
+ */
+ public static <T> IModel<T> of(SerializableSupplier<T> getter)
+ {
+ return new LambdaModel<>(getter);
+ }
+
+ /**
   * Create a {@link LambdaModel} for a given target. Usage:
   * <pre>
   * {@code


Reply via email to