You are right about public/private. There is no need to leave this public. 

I fall into the habit of leaving things public in Polymer elements because expressions in HTML can't access private fields due to the limitations in reflection and this caused a lot of changes from/to private/public in the past.

When the button is created this method is called 4 times (initialization of each attribute that influences classes)
In JavaScript this is called twice for each attribute (undefined to null, null to concrete value).

Each updated triggers the update of the binding to the classes.
This is the main reason. If it was only for the update of the `btnClasses` map, I would never have done this.

I didn't invent the pattern myself. I found it in several polymer-elements and these people seem to know their business and it seemed reasonable to me.