The simple rule is: never use direct access (except, of course, when referring to them from inside the class).
- field access can't be proxied
- you may want to have some event notification
- you may want to guard against race conditions
- expression languages support setters and getters
- theoretically this breaks encapsulation. (If we are pedantic, setter and getter for all fields also breaks encapsulation though)
- you may want to perform some extra logic inside the setter or getter, but that is rarely advisable, since consumers expect this to follow the convention - i.e. being a simple getter/setter.
- you can specify only a setter or only a getter, thus achieving read-only, or write-only access.
Even if this does not happen that you need any of these, it is not unlikely. And if you start with field access, it will be harder to change.