Thank you for your answer Thomas.

"Local variable or parameter can be final" inspection actually does
something different. It will warn that a parameter can be made final when
its value does not change, even if it not used in an anonymous class. This
will result in programmers declaring all variables that they can as final
and using them in the anonymous classes, which will again result in the
same serialization oversights I mentioned...

The same applies to checkstyle.

I wonder why this is not a problem for others using wicket. Given wicket's
serialization, since java 8 that allowed anonymous classes to access
variables from the enclosing scope even if they are not declared final, I
find there is a lot of room for unintentionally serializing stuff that you
didn't want/notice is being serialized... Perhaps we are doing something
wrong...


On Sun, Aug 4, 2019 at 11:35 AM Thomas Heigl <[email protected]> wrote:

> Hi Marios,
>
> I don't think there is a way to disable this behaviour but you have other
> options:
>
> - If you use IntelliJ, you can configure the "Local variable or parameter
> can be final" inspection to raise an error instead of a warning (for
> variables that are implicitly final)
> - Checkstyle or similar tools that you can hook into your build process
> might have similar inspections
>
> Best,
>
> Thomas
>
> On Sun, Aug 4, 2019 at 9:18 AM mscoon <[email protected]> wrote:
>
> > Hi all,
> >
> > Java 8 introduced the ability to access effectively final
> variables/method
> > parameters from anonymous classes without having to add explicitly the
> > "final" keyword.
> >
> > This has resulted in a lot of cases where the programmer does not notice
> > that they are referencing a model object from an anonymous class, which
> > results in the model object being serialized.
> >
> > Example:
> > code inside a hypothetical MyPanel.newLink() method...
> >
> > Myclass obj = getModelObject();
> > return new AjaxLink<Void>("link") {
> > void onClick(AjaxRequestTarget t) {
> >  if (obj.getId() != null) {
> >    // do something
> >  } else {
> >   // do something else
> >  }
> > }
> >
> > In previous java versions you'd have to declare obj as final, and this
> > would help you notice that it is going to be serialized.
> >
> > I understand that it is easy to change the code and avoid obj being
> > serialized. The problem is not how to fix the code - the problem is that
> > this "problem" often goes unnoticed.
> >
> > As far as I have searched, there is no way to disable this behavior (not
> > having to explicitly declare variables as final) in java 8.
> >
> > Do you have any suggestions on how to handle this?
> >
> > Thank you in advance,
> > Marios
> >
>

Reply via email to