52 votes

Pourquoi Scala n'a-t-il pas de membres statiques à l'intérieur d'une classe ?

Je sais que tu peux les définir indirectement réaliser quelque chose de similaire avec les objets compagnons, mais je me demande pourquoi la statique a été supprimée des définitions de classes dans la conception du langage.

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 format static 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.

58voto

Kevin Wright Points 31665

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.

0 votes

En fait, les statiques en Java sont héritées.

6 votes

@Daniel - C'est discutable, l'héritage a une signification assez spécifique en OO. Je décrirais les statiques comme étant tirées dans la portée, et non héritées. La différence devient apparente lorsque l'on parle de champs statiques par opposition aux méthodes statiques. Une chose héritée peut également être réellement surchargée, au lieu d'être simplement cachée.

2 votes

Les méthodes statiques sont héritées, mais elles ne sont pas distribuées dynamiquement. elles sont résolues au moment de la compilation. en quoi le fait de les définir dans un objet en scala vous aide-t-il à gérer l'héritage ou le polymorphisme - deux inconvénients majeurs de l'approche de java ?

17voto

numan salati Points 4684

J'ai également posté cette question sur le groupe google des utilisateurs de scala et Bill Venners, l'un des auteurs de "Programming in scala", a répondu en donnant quelques idées.

Jetez un coup d'oeil à ça : https://groups.google.com/d/msg/scala-user/5jZZrJADbsc/6vZJgi42TIMJ et https://groups.google.com/d/msg/scala-user/5jZZrJADbsc/oTrLFtwGjpEJ

En voici un extrait :

Je pense qu'un était simplement d'être plus simple, en faisant en sorte que chaque valeur soit un objet, et chaque opération un appel de méthode. Les statiques et les primitives de Java sont cas spéciaux, ce qui rend le langage plus "compliqué" dans un certain sens. sens.

Mais un autre élément important, je pense, est d'avoir quelque chose que l'on peut mettre en correspondance avec la méthode Java de Java en Scala (parce que Scala avait besoin d'une construction qui correspondait aux statiques de Java pour l'interopérabilité), mais qui bénéficie de l'héritage/polymorphisme OO héritage/polymorphisme. Les objets singletons sont de vrais objets. Ils peuvent Ils peuvent étendre une superclasse ou intégrer des traits et être transmis en tant que tels. Pourtant, ils sont également "statiques" par nature. Cela s'avère très pratique dans la pratique.

Jetez également un coup d'œil à cet entretien avec Martin Odersky (faites défiler la page jusqu'à la section Innovations orientées objet dans Scala). http://www.artima.com/scalazine/articles/goals_of_scala.html

En voici un extrait :

Tout d'abord, nous voulions être un langage purement orienté objet, où chaque valeur est un objet, chaque opération est un appel de méthode et chaque variable est un membre d'un objet. Nous ne voulions donc pas de statiques, mais nous avions besoin de quelque chose pour les remplacer, nous avons donc créé la construction d'objets singletons. Mais même les objets singleton sont toujours des structures globales. Le défi était donc de les utiliser le moins possible, car lorsque vous avez une structure globale, vous ne pouvez plus la modifier. Vous ne pouvez pas l'instancier. Il est très difficile de la tester. Il est très difficile de la modifier de quelque manière que ce soit.

Pour résumer :

D'un point de vue de la programmation fonctionnelle, les membres statiques sont généralement considérés comme mauvais (voir ceci poste par Gilad Bracha - le père des génériques java. Il s'agit principalement d'effets secondaires dus à l'état global). Mais Scala devait trouver un moyen d'être interopérable avec Java (il devait donc supporter les statiques) et pour minimiser (mais pas totalement éviter) les états globaux qui sont créés à cause des statiques, Scala a décidé de les isoler dans des objets compagnons.

Les objets compagnons ont également l'avantage d'être extensibles, c'est-à-dire de tirer parti de l'héritage et de la composition de mixins (indépendamment de l'émulation de fonctionnalités statiques pour l'interopérabilité).

4voto

agilesteel Points 8330

Ce sont les choses qui me viennent à l'esprit quand je pense à la façon dont les statiques pourraient compliquer les choses :

1) L'héritage ainsi que le polymorphisme nécessiteraient des règles spéciales. Voici un exemple :

// This is Java
public class A {
  public static int f() {
    return 10;
  }
}

public class B extends A {
  public static int f() {
    return 5;
  }
}

public class Main {
  public static void main(String[] args) {
    A a = new A();
    System.out.println(a.f());
    B b = new B();
    System.out.println(b.f());
    A ba = new B();
    System.out.println(ba.f());
   }
}

Si vous êtes sûr à 100% de ce qui est imprimé, tant mieux pour vous. Le reste d'entre nous peut se fier à des outils puissants tels que @Override qui est bien sûr facultative et l'annotation amicale "La méthode statique f() du type A doit être accédée de manière statique". avertissement. Cela nous amène à

2) La "manière statique" d'accéder aux éléments est une autre règle spéciale, qui complique les choses.

3) Les membres statiques ne peuvent pas être abstraits. Je suppose que l'on ne peut pas tout avoir, n'est-ce pas ?

Et encore, ce ne sont que des choses qui me sont venues à l'esprit après avoir réfléchi à la question pendant quelques minutes. Je parie qu'il y a un tas d'autres raisons pour lesquelles la statique ne s'intègre pas dans le paradigme OO.

2voto

Simone Points 1504

C'est vrai, les membres statiques n'existent pas, MAIS, il est possible d'associer un objet singleton à chaque classe :

class MyClass {
}

object MyClass {
}

pour obtenir des résultats similaires

2voto

Balaji Reddy Points 780

La programmation orientée objet concerne les objets et leurs états (sans toucher aux objets à état complet et sans état en Java). J'essaie de souligner "Le statique n'appartient pas aux objets". Les champs statiques ne peuvent pas être utilisés pour représenter l'état d'un objet. donc il est rationnel de le retirer des objets.

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