Pourquoi ne pas Scala ont des membres statiques à l'intérieur d'une classe?
Je sais que vous pouvez définir indirectement réaliser quelque chose de similaire avec la compagne d'objets, mais je me demande pourquoi, comme une langue de conception ont été statique chuté hors de définitions de classe.
- Ma conjecture est que, sans
static
, la conception d'ensemble de la Scala de simplifie. Nous avons déjà des classes et des objets qui sont des instances de classes, l'idée d'un objet singleton (une classe qui n'est instancié qu'une seule fois) est très simple et naturelle. Par la voie, à la JVM niveau, les objets singleton sont vraiment unique instances d'une classe. Les méthodes sur un objet singleton ne compile pas àstatic
méthodes. Cela peut être utile pour des choses comme la définition d'un objet singleton qui hérite de traits. - belle pensée, et assez proche de la marque. La décision initiale a été de laisser tomber la statique (comme n'étant pas-OO, et avec un couple d'espace de noms préoccupations). Singleton objets ont ensuite été ajoutés à la langue comme une meilleure façon de remplir le rôle que la statique réalisée en Java (et autres C++ dérivés).
- J'ai édité la question à préciser que les membres de la Scala de singleton objets ne sont pas vraiment la même chose que Java est
static
membres. - en fait, si vous regardez dans la bytecode, vous verrez que l'objet est compilé pour une classe avec des méthodes statiques.
- Objet compile à la classe avec des membres statiques? À partir de la REPL, j'ai essayé ceci:
object Foo { def x = 1 }
et puis:javap -v Foo
. Je reçoispublic int x(); ...
sansstatic
. Comparer, par exemple,:javap -v java.lang.Integer
, où les méthodes statiques sont apparentes. Ai-je raté quelque chose? Scala 2.9.1. Dans tous les cas, la Scala, la compagne de l'objet est différente de la sémantique de Java membres statiques. - je viens de compiler l'exemple avec scalac (2.9). couru "javap -c Foo". Je vois "public static final int x();" Si vous exécutez javap à l'intérieur de la classe "Toto$" je vois "public int x();". Il semble que les Foo délégués de Foo$ où "x" est invoquée pratiquement. Je ne sais pas pourquoi il a besoin de le faire...
- L'ainsi nommé "statique transitaires" sont mis en œuvre spécifiquement pour prendre en charge Java interop, ces méthodes ne sont pas utilisés à l'interne par Scala.
Vous devez vous connecter pour publier un commentaire.
Le O OO signifie "Objet", pas de classe. Étant orientée objet est tout au sujet des objets, ou le cas (si vous préférez)
Statique n'appartiennent pas à un objet, il ne peut pas être héritée, ils ne prennent pas part au polymorphisme. Il suffit de mettre, la statique ne sont pas orientées objet.
Scala, d'autre part, est orientée objet. Plus encore que Java, qui a essayé particulièrement difficiles à se comporter comme C++, afin d'attirer les développeurs de cette langue.
Ils sont un hack, inventé par le C++, qui cherchait à combler les mondes de la procédure et de la programmation orientée-objet, et qui a besoin d'être amont compatibles avec C. Elle a aussi admis primitives pour des raisons similaires.
Scala gouttes de la statique et les primitives, parce qu'ils sont une relique d'une époque où les ex-développeurs de procédure nécessaires pour être apaisé. Ces choses n'ont pas de place dans n'importe quel bien-conçu langue qui souhaite décrire elle-même orientée objet.
Concernant pourquoi il est important de par vraiment OO, je vais sans vergogne copier et coller cet extrait de Bill Venners sur la liste de diffusion:
Ne pouvais pas le mettre c'est mieux moi-même!
Donc, si vous voulez créer un de quelque chose, alors, à la fois statique et de la singletons peuvent faire le travail. Mais si vous voulez qu'une chose à hériter de comportement à partir de quelque part, puis de la statique ne vous aide pas.
Dans mon expérience, vous avez tendance à utiliser cette capacité beaucoup plus que vous auriez pensé à l'origine, en particulier après que vous avez utilisé Scala pour un certain temps.
J'ai aussi posté cette question sur scala utilisateurs de google groupe et Bill Venners l'un des auteurs de "Programming in scala" réponse, quelques pistes de réflexion.
Prendre un coup d'oeil à ceci: https://groups.google.com/d/msg/scala-user/5jZZrJADbsc/6vZJgi42TIMJ et https://groups.google.com/d/msg/scala-user/5jZZrJADbsc/oTrLFtwGjpEJ
Voici un extrait:
Également prendre un coup d'oeil au cours de cette entrevue avec Martin Odersky (faites défiler vers le bas de l'orienté Objet innovations en Scala section) http://www.artima.com/scalazine/articles/goals_of_scala.html
Voici un extrait:
Pour Résumer:
À partir d'un point de vue de la programmation fonctionnelle des membres statiques sont généralement considérées comme mauvaises (voir ce post par Gilad Bracha - le père de java génériques. Il a surtout à voir avec des effets secondaires en raison de l'état global). Mais scala a fallu trouver un moyen pour être interopérable avec Java (il avait à l'appui de la statique) et de réduire au minimum (bien que pas totalement éviter) les états globaux qui est créé à cause de la statique, de la scala a décidé de les isoler dans compagnon objets.
Compagnon objets ont également l'avantage d'être extensible, c'est à dire. tirer parti de l'héritage et de composition mixin (distincte de l'émulation statique de la fonctionnalité pour l'interopérabilité).
Ce sont des choses qui pop dans ma tête quand je pense à la façon statique pourrait compliquer les choses:
1) l'Héritage polymorphisme nécessiterait des règles spéciales. Voici un exemple:
Si vous êtes sûr à 100% sur ce qui est imprimé, et bon pour vous. Le reste d'entre nous peut en toute sécurité compter sur de puissants outils comme
@Override
annotation, qui est bien sûr facultatif et l'amicale "La méthode statique f() du type A doit être accessible de manière statique" avertissement. Ce qui nous amène à2) La "rigidité" de l'accès des choses est une autre règle spéciale, ce qui complique les choses.
3) membres Statiques ne peuvent pas être abstraite. Je suppose que vous ne pouvez pas tout avoir, non?
Et encore, ce sont juste des choses qui est venu à mon esprit après que j'ai donné à la question de la pensée pour un couple de minutes. Je parie qu'il ya un tas d'autres raisons, pourquoi statique, il suffit de ne pas entrer dans le paradigme OO.
C'est vrai, membre statique n'existe pas, MAIS, il est possible d'associer un objet singleton pour chaque classe:
pour obtenir des résultats similaires
De la programmation orientée objet est tout au sujet d'objets et de ses états(ne Pas toucher à l'état complet et apatrides objets en Java). Je suis en train de stress “Statique n'appartiennent pas à des objets”. Les champs statiques ne peuvent pas être utilisés pour représenter l'état d'un objet il est donc rationnel de retirer des objets.