35 votes

Pourquoi les objets singleton sont-ils plus orientés objet?

Dans Programming in Scala: Un guide complet étape par étape, l'auteur a déclaré:

Une façon dont Scala est plus orienté objet que Java est que les classes en Scala ne peuvent pas avoir de membres statiques. Au lieu de cela, Scala a des objets singletons.

Pourquoi un objet singleton est-il plus orienté objet? Quel est l'intérêt de ne pas utiliser de membres statiques, mais des objets singletons?

59voto

Kevin Wright Points 31665

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 :

  1. Les membres statiques ne peuvent pas être hérités d'une classe/trait parent

  2. Les membres statiques ne peuvent pas être utilisés pour implémenter une interface

  3. Les membres statiques d'une classe ne peuvent pas être passés en argument à une fonction

    (et en raison des points ci-dessus...)

  4. Les membres statiques ne peuvent pas être remplacés

  5. 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 !

12voto

Les objets Singleton se comportent comme des classes en ce qu'ils peuvent étendre / implémenter d'autres types.

Impossible de le faire en Java avec des classes statiques simplement - c'est plutôt du sucre par-dessus le modèle de conception Singleton en Java avec un getInstance qui permet (au moins) de meilleurs espaces de noms /identifiants stables et masque la distinction.

10voto

Jörg W Mittag Points 153275

Indice : cela s'appelle la programmation orientée objet.

Sérieusement.

Peut-être que je manque quelque chose de fondamentalement important, mais je ne vois pas de quoi tout le bruit est fait : les objets sont plus orientés objet que les non-objets car ce sont des objets. Est-ce que cela a vraiment besoin d'une explication ?

Remarque : Bien que cela semble être le cas, je ne cherche vraiment pas à paraître prétentieux ici. J'ai examiné toutes les autres réponses et je les ai trouvées terriblement confuses. Pour moi, il est plutôt évident que les objets et les méthodes sont plus orientés objet que les espaces de noms et les procédures (ce qui est en fait ce que sont les "méthodes" statiques) par la même définition de "orienté objet".

Une alternative à avoir des objets singleton serait de faire des classes elles-mêmes des objets, comme le font par exemple Ruby, Python, Smalltalk, Newspeak.

2voto

Piotr Findeisen Points 1712

Il existe quelques différences qui peuvent être importantes dans certains scénarios. En Java, vous ne pouvez pas remplacer une méthode statique donc si vous aviez une classe avec des méthodes statiques, vous ne seriez pas capable de personnaliser et remplacer une partie de son comportement. Si vous utilisiez un objet singleton, vous pourriez simplement brancher un singleton créé à partir d'une sous-classe.

2voto

Yann Ramin Points 25139

Pour les membres statiques, il n'y a pas d'objet. La classe est vraiment juste un espace de noms.

Dans un singleton, il y a toujours au moins un objet.

Franchement, c'est de la pinaillerie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X