Can't this method be made like this (perhaps on IModel?):
/**
* Create a read-only {@link IModel}. Usage:
* <pre>
* {@code
* LambdaModel.of(person::getName)
* }
* </pre>
* Note that {@link IModel} is a {@code FunctionalInterface} and you can
* also use a lambda directly as a model.
*
* @param getter used to get value
* @return model
*
* @param <T> model object type
*/
public static <T> IModel<T> of(SerializableSupplier<T> getter)
{
return getter::get;
}
Emond
On donderdag 10 november 2016 21:40:58 CET Sven Meier wrote:
> 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