Essayer pour obtenir la "vue d'ensemble"; la plupart de ces points ont été abordés dans d'autres réponses, mais il ne semble pas y avoir de réponse complète unique qui met tout ensemble et relie les points. Alors on y va...
Les méthodes statiques sur une classe ne sont pas des méthodes sur un objet, cela signifie que :
-
Les membres statiques ne peuvent pas être hérités d'une classe/trait parent
-
Les membres statiques ne peuvent pas être utilisés pour implémenter une interface
-
Les membres statiques d'une classe ne peuvent pas être passés en argument à une fonction
(et en raison des points ci-dessus...)
-
Les membres statiques ne peuvent pas être remplacés
-
Les membres statiques ne peuvent pas être polymorphiques
Le but des objets est qu'ils peuvent hériter d'objets parents, implémenter des interfaces et être passés en argument - les membres statiques n'ont aucune de ces propriétés, donc ils ne sont pas vraiment orientés objet, ils ne sont rien de plus qu'un espace de noms.
Les objets Singleton, en revanche, sont des membres à part entière de la communauté des objets.
Une autre propriété très utile des singletons est qu'ils peuvent facilement être modifiés ultérieurement pour ne plus être des singletons, c'est un refactoring particulièrement douloureux si vous commencez à partir de méthodes statiques.
Imaginez que vous avez conçu un programme pour l'impression des adresses et que vous avez représenté les interactions avec l'imprimante via des méthodes statiques sur une classe, puis plus tard vous voulez pouvoir ajouter une deuxième imprimante et permettre à l'utilisateur de choisir laquelle ils utiliseront... Ce ne serait pas une expérience amusante !