Используйте константы Scala в Java - PullRequest
8 голосов
/ 05 октября 2010

Я сейчас оцениваю Scala для будущих проектов и наткнулся на что-то странное. Я создал следующую константу для нас в JSP:

val FORMATED_TIME = "formatedTime";

И это не сработало. После некоторых экспериментов я решил декомпилировать, чтобы докопаться до сути:

private final java.lang.String FORMATED_TIME;

public java.lang.String FORMATED_TIME();
  Code:
   0:   aload_0
   1:   getfield    #25; //Field FORMATED_TIME:Ljava/lang/String;
   4:   areturn

Теперь это интересно! Лично мне уже давно интересно, зачем инспектору нужен префикс get и мутатор префикса set в Java, поскольку они живут в разных пространствах имен.

Однако все еще может быть неловко объяснять это остальным членам команды. Так возможно ли иметь публичную константу без инспектора?

Ответы [ 2 ]

11 голосов
/ 05 октября 2010

Это из-за принципа унифицированного доступа , т. Е. Методы и поля неразличимы

См. этот ответ

В Scala 2.8.0 это означает, что если у вас есть сопутствующий объект, вы теряете статические экспедиторы)

Если у вас это есть в Scala:

//Scala
object CommonControler {
      val FORMATED_TIME = "formatedTime";
}

Вы можете использовать это так с Java

//Java

// Variables become methods
CommonControler$.MODULE$.FORMATED_TIME();
// A static forwarder is avaliable
CommonControler.FORMATED_TIME();

Также см. Книгу Скала в глубине

Также обратите внимание на @scala.reflect.BeanProperty для классов.

1 голос
/ 05 октября 2010

Я еще раз изучил декомпилированный код и заметил кое-что еще.Переменные на самом деле не являются статическими.Поэтому моя следующая идея заключалась в том, чтобы использовать вместо этого объект:

object KommenControler
{
   val FORMATED_TIME = "formatedTime";
} // KommenControler

Но теперь все становится действительно ужасно:

public final class ….KommenControler$ extends java.lang.Object implements scala.ScalaObject{

public static final ….KommenControler$ MODULE$;

private final java.lang.String FORMATED_TIME;

public static {};
  Code:
   0:   new #9; //class …/KommenControler$
   3:   invokespecial   #12; //Method "<init>":()V
   6:   return

public java.lang.String FORMATED_TIME();
  Code:
   0:   aload_0
   1:   getfield    #26; //Field FORMATED_TIME:Ljava/lang/String;
   4:   areturn

Так что я получаю дополнительный класс, заканчивающийся на $, который имеет экземпляр-одиночканазывается MOUDLE $.И еще есть инспектор.Таким образом, доступ к переменной внутри jsp становится следующим:

final String formatedTime = (String) request.getAttribute (….KommenControler$.MODULE$.FORMATED_TIME ());

Это работает, как и ожидалось, и я лично могу жить с этим, но как я собираюсь объяснить это команде?

OfКонечно, если есть более простой способ, я хотел бы услышать об этом.

...