Yes, companion singletons provide an equivalent to Java’s (and C++’s, c#’s, etc.) static methods.
(indeed, companion object methods are exposed via “static forwarders” for the sake of Java interop)
However, singletons go a fair way beyond this.
- A singleton can inherit methods from other classes/traits, which can’t be done with statics.
- A singleton can be passed as a parameter (perhaps via an inherited interface)
- A singleton can exist within the scope of a surrounding class or method, just as Java can have inner classes
- It’s also worth noting that a singleton doesn’t have to be a companion, it’s perfectly valid to define a singleton without also defining a companion class.
Which helps make Scala a far more object-oriented language that Java (static methods don’t belong to an object). Ironic, given that it’s largely discussed in terms of its functional credentials.