簡體   English   中英

在Java中使用Scala常量

[英]Use Scala constants in Java

我目前正在評估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和一個mutator在Java中設置的前綴,因為它們位於不同的名稱空間中。

然而,向團隊的其他成員解釋這可能仍然很尷尬。 那么沒有檢查員就可以有一個公共常數嗎?

這是因為統一訪問原則 ,即:方法和字段無法區分

看到這個答案

在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 in Depth一書

另請注意類的@ scala.reflect.BeanProperty

我進一步研究了反編譯代碼,並注意到了其他一些東西。 變量實際上不是靜態的。 所以我的下一個想法是使用一個對象:

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 ());

這可以按預期工作,我個人可以忍受它,但我將如何向團隊解釋?

當然,如果有一種更簡單的方式我喜歡聽到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM