2011-12-08 9 views
8

は以下のScalaのオブジェクトを考える:JavaのかっこなしでScalaオブジェクトのvalにアクセスできますか?

object ScalaObject { 
    val NAME = "Name" 
} 

ScalaのコンパイラがNAMEフィールドにアクセスするためのパラメータのないメソッドを生成していることが表示されます。

System.out.println(ScalaObject$.MODULE$.NAME()); 

アクセスにJavaのを許可するようにScalaのコンパイラを同軸にする方法はあります:私は、Javaからこのフィールドにアクセスしようとしたときのようなパラメータのないメソッドは、このフィールドにアクセスする唯一の方法があるようにしかし、それが見えます期待されるJavaのイディオムあたりval

System.out.println(ScalaObject$.MODULE$.NAME); 
+0

小文字の値でも同じことが起こりますか? – ziggystar

+0

途中で期待される* Java *イディオムではなく、期待される* Scala *イディオムです。バイトコードに関しては、Scala(ほぼ?)はフィールドを常に同じ名前のゲッターメソッドとして公開します。 –

+1

@AndrzejDoyle、あなたが言っていることは分かりません。 Javaでは、それを行う唯一の方法なので、括弧なしでstatic finalフィールドにアクセスすることが期待されています。あなたが示唆しているように思われるのは、Scalaでは、期待される手法はゲッターメソッドを使うことです。いずれにしても、Scalaの推奨技術は何であれ、Scalaで実装されるAPIのJavaクライアントには関係していないようです。 –

答えて

7

厳密には、スカラがフィールドを生成するのではなく、それにアクセスするためのメソッドのペアを生成するため、答えはいいえです。ただし、valのスカラーに@scala.reflect.BeanPropertyと注釈を付けると、Javaスタイルのゲッターとセッターメソッドが生成されます。そう

あなたは(あなたのケースで)言うことができないだろうが

ScalaObject$.MODULE$.NAME 

あなたよりJavaのようなイディオムだろう

ScalaObject$.MODULE$.getNAME() 

を言うことができるだろうあなたが望んでいたものではありません。

N.B.私は@BeanPropertyのようにすべて大文字の名前を試していないので、実際に何が生成されるのか分かりません。

1

いいえ、バイトコードでフィールドにアクセスし、メソッドを呼び出すためのさまざまな指示がありますので。その後、Javac(そしてあなたのIDEシンタックスハイライト)にパッチを当てなければなりません。

+4

私はOPが、フィールドとしてコンパイルされたJavaメソッドにアクセスする方法ではなく、Javaフィールドを生成するためにscalacを得るためにいくつかのアノテーションを期待していると思います。 – themel

+0

@themelは正しいです。 –

関連する問題