Le O dans OO signifie "Object", pas "class". L'orientation objet concerne les objets, ou les instances (si vous préférez).
Les statiques n'appartiennent pas à un objet, ils ne peuvent pas être hérités, ils ne participent pas au polymorphisme. Pour faire simple, les statiques ne sont pas orientées objet.
Scala, d'autre part, est orienté objet. Bien plus que Java, qui s'est efforcé de se comporter comme le C++, afin d'attirer les développeurs de ce langage.
Ils sont un hack, inventé par le C++, qui cherchait à jeter un pont entre les mondes de la programmation procédurale et OO, et qui devait être rétrocompatible avec le C. Il a également admis les primitives pour des raisons similaires.
Scala laisse tomber les statiques et les primitives parce qu'elles sont une relique d'une époque où les développeurs ex-procéduraux avaient besoin d'être apaisés. Ces choses n'ont pas leur place dans un langage bien conçu qui souhaite se décrire comme orienté objet.
Concernant pourquoi il est important d'être vraiment OO, je vais copier et coller sans vergogne ce passage de Bill Venners sur la liste de diffusion :
La façon dont je vois les choses, cependant, c'est que les objets singleton vous permettent de de faire les choses statiques là où elles sont nécessaires de manière très concise, mais mais aussi de bénéficier de l'héritage quand vous en avez besoin. Un exemple est plus facile de tester les parties statiques de votre programme, parce que vous pouvez faire traits qui modélisent ces parties et utiliser ces traits partout. Ensuite, dans programme de production, utilisez une implémentation d'objet unique de ces traits traits, mais dans les tests, utilisez des instances fantaisie.
Je n'aurais pas pu mieux dire !
Ainsi, si vous voulez créer un seul exemplaire de quelque chose, les statiques et les singletons peuvent faire l'affaire. Mais si vous voulez que cette seule chose hérite du comportement d'un autre élément, alors les statiques ne vous aideront pas.
D'après mon expérience, vous avez tendance à utiliser cette capacité bien plus souvent que vous ne l'auriez pensé au départ, surtout après avoir utilisé Scala pendant un certain temps.
2 votes
Je pense que sans
static
la conception générale de Scala se simplifie. Nous avons déjà des classes, et des objets qui sont des instances de classes, donc l'idée d'un objet singleton (une classe qui n'est instanciée qu'une fois) est très naturelle et simple. D'ailleurs, au niveau de la JVM, les objets singleton sont en réalité des instances uniques d'une classe. Les méthodes d'un objet singleton ne sont pas compilées en formatstatic
méthodes. Cela peut être utile pour des choses comme la définition d'un objet singleton qui hérite de traits.1 votes
@kipton belle réflexion, et assez proche de la cible. La décision initiale était de laisser tomber les statiques (comme n'étant pas OO, et avec quelques problèmes d'espace de noms). Les objets singletons ont ensuite été ajoutés au langage comme un meilleur moyen de remplir le rôle que les statiques jouaient dans Java (et d'autres dérivés du C++).
0 votes
J'ai modifié la question pour préciser que les membres des objets singleton de Scala ne sont pas vraiment les mêmes que ceux de Java.
static
membres.0 votes
@kipton, en fait, si vous regardez le bytecode résultant, vous verrez que l'objet est compilé en une classe avec des méthodes statiques.
0 votes
@numan, L'objet se compile en classe avec des membres statiques ? Depuis le REPL, j'ai essayé ceci :
object Foo { def x = 1 }
et ensuite:javap -v Foo
. Je reçoispublic int x(); ...
sans lestatic
. Comparer à, dire,:javap -v java.lang.Integer
où les méthodes statiques sont apparentes. Est-ce que quelque chose m'échappe ? Scala 2.9.1. Dans tous les cas, l'objet compagnon de Scala a une sémantique différente de celle des membres statiques de Java.0 votes
@Kipton, je viens de compiler votre exemple avec scalac (2.9). J'ai lancé "javap -c Foo". Je vois "public static final int x() ;" Si vous exécutez javap sur la classe interne "Foo$" je vois "public int x() ;". Il semble que Foo délègue à Foo$ où "x" est invoqué virtuellement. Je ne sais pas trop pourquoi il faut faire ça...
3 votes
@Numan - Les "forwarders statiques" sont implémentés spécifiquement pour supporter l'interopérabilité Java, ces méthodes ne sont pas utilisées en interne par Scala.