Some of my own results from Effective Java , paragraph 15, insertion of relevant statements from the same
βRecall that in order to guarantee immutability, a class should not allow itself to be subclassed. Usually this is done by making the class final, but there is another, more flexible way to do this. An alternative to creating an indispensable final for a class is to create all its private or batch-private constructors, and also add public static plants to the place of public designers (clause 1).
Although this approach is not commonly used, it is often the best alternative. this is the most flexible as it allows the use of multiple package-private classes implementation. . An immutable class is effective for its customers who are outside its package because it is not possible to extend a class that comes from another package and that does not have an open or protected constructor. Besides the flexibility of several implementation classes, this approach allows you to tune the performance of the class in subsequent releases, improving the object caching capabilities of static plants.
"
static factory and constructor benefits are discussed
source share