4

私は Groovy (私にとっては新しい) を使用して、Java 値オブジェクト クラスを Groovy と同等のものに置き換え、残りの Java コードベースとの互換性を維持しながら、よりクリーンで簡潔なコードを取得しようとしています。(この試行が失敗した場合、Google にフォールバックする可能性があります@AutoValue。)

値オブジェクトは、ビルダー パターンを使用して Java コードからインスタンス化できます。セッター メソッドはプレフィックスなしである必要があり、理想的にはビルダーは、構成可能な名前を持つ静的メソッドを介してインスタンス化できる必要があります。

@groovy.transform.builder.BuilderのJavadocは、「Java統合が必要な場合」に使用できると述べており、有望に見える構成パラメーターもあることがわかりますが、Javaコードから使用する方法がわかりませんでした。

これは、X を何に置き換えたらよいかわからない場合の試みです。

Greeting.groovy:

import groovy.transform.Immutable
import groovy.transform.builder.Builder

@Immutable
@Builder
public class GroovyGreeting {
  String message
}

GroovyGreetingTest.java:

GroovyGreeting g = X.message("foo").build();

編集: 2 つのクラスが生成されtarget/classes/com/hello/GroovyGreeting.classますtarget/classes/com/hello/GroovyGreeting$com/hello/GroovyGreetingBuilder.class。そこにある '$' は本当に奇妙で、それを参照できません (import com.hello.GroovyGreeting$com.hello.GroovyGreetingBuilder違法です)。また、何らかの理由でIntelliJ IDEAでは逆コンパイルできますGroovyGreetingBuilder.classが、できませんGroovyGreeting.class(開こうとしても反応しません)。

4

1 に答える 1

3

I had exactly the same problem. After investigating the code of the Builder strategies, I managed to make it work by explicitly specifying the builderClassName.

package alfa.beta

@Builder(builderClassName = 'PageLayoutBuilder')
class PageLayout

I can see that the generated builder is alfa/beta/PageLayout$PageLayoutBuilder now.

I filed a JIRA issue GROOVY-7501 for this.

于 2015-07-13T11:31:41.240 に答える