Item 04 Enforce noninstantiability with private constructor from Joshua Bloch's book "Effective Java"
Why would you need to make classes non-instantiable?
1) To make "utility" classes (stateless classes with nothing but static methods)
2) To make instance-controlled classes (see static factory method video)
Using abstract classes for this purpose does not work because they can be subclassed and instantiated that way.
This idiom appears to be counterintuitive because you provide a constructor for the sole purpose of not allowing it to be called. Because of this, make sure to document why this is so.
Also, this idiom also has a side effect: it prevents the class from being sub-typed. If used for utility classes, is senseless to "extend" them. For other cases, consider composition over inheritance.