2016-12-20 21 views
1

私は現在、新しいコードがscalaで書かれているがかなりの古いJavaコードが残っているかなり大きなコードベースで作業しています。特に、私たちと話をしなければならない多くのJava APIがあります。古いコードは、例えば、公共非finalフィールド、任意のメソッドやコンストラクタなし、と単純なJava POJOを使用しています。我々は、これらのタイプにヘルパーメソッドまたはコンストラクタを追加するオプションを持っていけないScalaマクロ:Java Pojoのファクトリまたはctorを生成します。

public class MyJavaPojo { 
    public String myField1; 
    public MyOtheJavaPojo myField2; 
} 

注意を。これらは現在、このような古いC構造体(前の名前つきパラメータ)のように作成されます。このため

val myPojo = new MyJavaPojo 
myPojo.myField1 = ... 
myPojo.myField2 = ... 

、それは我々が突然、新しいフィールドを追加する場合は特に、フィールドのいずれかを割り当てることを忘れることは非常に簡単ですMyJavaPojoクラスに、私はnullに1つのフィールドを残しているとコンパイラは不平を言う。

注:java型/コンストラクタを通常の方法で変更するオプションはありません。私たちはまた、オブジェクト作成のためにたくさんの手作業で作成されたヘルパー関数を作成したくはありません。可能ではなく、スカラーマクロに基づいたソリューションを実際に探したいと思います。

私がしたいのは、Pojosのコンストラクタのようなメソッドか、名前付きパラメータを許可するファクトリを作成するマクロを生成するマクロを作成することです。 (基本的に、スケッチで手作業で書かれたヘルパーメソッドをgazillionで作成する代わりに、マクロに処理させる)。

スカラーマクロでこれを行う方法はありますか? (私はそれが可能だ、あるんだけど、私は私の人生の中でScalaのマクロを書いたことがありません)

理想のAPIの代替1:

val myPojo = someMacro[MyJavaPojo](myField1 = ..., myField2 = ...) 

理想のAPIの代わりの2

val factory = someMacro[MyJavaPojo] 
val myPojo = factory.apply(myField1 = ..., myField2 = ...) 

NOTE /重要:名前付きパラメータ!

私は、すぐに使える解決策を探しています。

すべてのアイデアと入力を感謝します!

答えて

1

scala-beanutilsをご覧ください。

@beanCompanion[MyJavaPojo] object MyScalaPojo 

MyScalaPojo(...) 

あなたのクラスは豆ではなく、それが唯一のScala 2.10のために作られていますが、ソースコードが< 200行で、あなたに開始する場所のアイデアを与える必要がありますように、それはおそらく、直接動作しません。

+0

クールなプロジェクト。ありがとう。 – user1892422

関連する問題