14

Scalaでは、valまたはvarを宣言すると、バイトコードにコンパイルされると、Scalaはプライベートフィールドとゲッターおよびセッターを自動的に生成します。

例えば

class myClass {
    val name = "My Name"
}

同等のものを作成するためにコンパイルされます

class myClass {
    private string name;
    public string name();
    public void name_$eq(string);
}

ここで、name()とname_ $ eqは、プライベート文字列名のゲッターとセッターです。

private [this] val / var blahとして宣言することで、プライベートフィールドのゲッターとセッターを提供しないように強制できることは知っていますが、コンパイル時にゲッターとセッターを生成しないパブリックフィールドを作成できる必要があります。

これはScalaでも可能ですか?

ありがとう

4

2 に答える 2

9

生成されたクラスには、提供したサンプルに見られるようなゲッターまたはセッターは含まれていません。生成されたクラスには、JavaBeanのゲッターまたはセッターは含まれていません。実際にコンパイラに生成さgetXsetXたメソッドを作成するには、varその変数に。で注釈を付ける必要があります@BeanProperty

Javaからパブリックフィールドにアクセスできるようにしたい場合は、残念ながら運が悪いと思います。少なくとも、scalaだけを使ってそれを達成する方法は見たことがありません。

あなたはscalaとjavaを混ぜることによってそれを達成することができます。次のようなJavaクラスを使用します。

public abstract class JavaClassWithPublicField {
   public String name = "My name";
}

そして、あなたのscalaコードでそのクラスを継承します:

class ScalaClassWithPubilcField extends JavaClassWithPublicField

それはおそらくそれを行うための最もクリーンな方法です。

于 2012-04-27T11:16:47.600 に答える
3

おそらく、Javaからアクセスしているため、属性の表現方法を強制したいとします。(ゲッターを取り除くことによってバイトコードを「最適化」しようとしている場合、時間を無駄にしているので、VMはすぐにそれらをインライン化します。)残念ながら、将来のためにドアをできるだけ大きく開いたままにしてください改善点として、Scalaの仕様では、 Scalaコードをバイトコードに変換する方法が指定されていません。これは、Scalaの特定のバージョンで機能するトリックを見つけたとしても、それ以降のバージョンで機能することが保証されていないことを意味します。

このような場合に推奨されるアプローチは、Javaで表示されるコードをJavaで記述してから、小さな接着剤クラスをScalaで記述することです。@Emilの回答のようなものは素晴らしいものです。

于 2012-04-27T20:41:17.363 に答える