2015-11-16 1 views
2

При определении Vals на объекте компаньона, как это:Как заставить scalac генерировать статическое конечное поле?

object Foo { val bar = 3 } 

Scala генерирует статические финальные методы:

$ scalac Foo.scala && javap Foo 
public final class Foo { 
    public static int bar(); 
} 

Есть ли способ сделать это генерировать статическое поле вместо статического метода?

FWIW, мне это нужно, поскольку у меня есть скомпилированный Java-код, и мне нужно сохранить двоичную совместимость.

ответ

5

В настоящее время на Scala нет статических полей, подобных Java, независимо от того, являются они окончательными или нет. См. Объяснение здесь, например: Why doesn't Scala have static members inside a class?.

Это одна из причин Akka не написанными 100% в Scala: http://www.infoq.com/interviews/klang-akka

Так что же Akka писать в ней?

Akka не сто процентов Scala, потому что некоторые конструкциям вы не можете выразить в Scala по соображениям производительности, так статические полю, например, так, когда вам нужно сделать некоторые хитрые вещи с параллельности вам нужно иметь статические поля, поэтому я думаю, что это как девяносто процентов Scala, а затем у нас есть материал Java только потому, что мы должны .

Вы можете сделать Java/Scala interop на стороне Java, т. Е. Создать в вашем случае какие-то адаптеры.

Есть существующие реализации для static fields, но неясно, когда мы его получим: https://issues.scala-lang.org/browse/SI-4581.

Я не могу найти способ сделать этот импорт компиляцией: import scala.annotation.static. Возможно, это не в моей версии Scala или отключено по умолчанию. В противном случае это был бы ответ:

object Foo { @static final val bar: Int = 3 }