When designing a library interface, what are some strategies to keep the API flexible, such that as it evolves it can avoid breaking changes as much as possible. I am asking specifically about Java library APIs, but I'm sure this translates into other languages and possibly even web APIs (e.g. REST APIs).
An example of such a strategy would be using the builder pattern for constructing objects which will likely require new optional properties in the future. If optional properties are passed to a constructor as nullable parameters, adding new ones is a breaking change.
What other strategies are best practice for creating a flexible and stable API?