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çois public int x(); ... sans static. 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.

InformationsquelleAutor numan salati | 2011-09-04