Memory consumption of anonymous classes vs. concrete subclass

David Holmes david.holmes at oracle.com
Wed Mar 24 04:00:08 UTC 2021


Hi Nir,

On 24/03/2021 4:18 am, Nir Lisker wrote:
> Hi,
> 
> In JavaFX we have classes of the form
> 
> abstract class SomeObjectProperty {
> 
>      abstract String getName();
>      abstract Object getBean();
> }
> 
> And a concrete
> 
> class SimpleSomeObjectProperty extends SomeObjectProperty {
> 
>      String name;
>      Object bean;
> 
>      SimpleSomeObjectProperty(String name, Object bean) {
>          this.name = name;
>          this.bean = bean;
>      }
> 
>      @Override
>      abstract String getName() { return name; }
> 
>      @Override
>      abstract Object getBean() { return bean; }
> }
> 
> When we want to use a SomeObjectProperty, we usually use an
> anonymous subclass:
> 
> SomeObjectProperty prop = new  SomeObjectProperty() {
> 
>      @Override
>      public Object getBean() {
>          return ThisClass.this;

What role does ThisClass play here?

>       }
> 
>      @Override
>      public String getName() {
>          return "prop ";
>       }
> }
> 
> The reason being memory consumption. The anonymous class takes less memory
> because it holds less references. The amount varies depending on the number
> of fields and their getters (in this case we had 2, but it could be more),
> but we have done tests that show the memory footprint difference. However,
> this is much less readable obviously and much longer.
> Since JavaFX uses these properties extensively, the memory issue is
> significant and the readability issue is prominent.
> 
> I want the best of both worlds - more readable with less memory. I would
> think that under the hood something could be done to optimize this code
> since effectively it does the same. Is it possible to do something about
> this?

But the code is not effectively the same. The concrete class is a 
general class that can be instantiated multiple times for different 
beans and names - hence the fields are needed to store them. The 
anonymous class is for a singleton instance hard-wired to return one 
bean and one name. You could define a named class, specific to a given 
property, with no fields and which was also hard-wired the same way.

Cheers,
David

> - Nir
> 



More information about the valhalla-dev mailing list