4

interfaceアクセサメソッド定義のみを受け取り、不変オブジェクトクラスと、新しいインスタンスを段階的に構築したり、新しいインスタンスを作成して既存のインスタンスを変更したりするための「ビルダー」クラスを自動的に生成するJava 用のツールまたはライブラリは何ですか?

入力例:

public interface Car {
    String getModelName();
    int getWheelCount();
}

出力例:

import javax.annotation.concurrent.Immutable;
import javax.annotation.concurrent.NotThreadSafe;

@Immutable
public final class ImmutableCar implements Car {

    @NotThreadSafe
    public static final class Builder implements Car {

        private String modelName;
        private int wheelCount;

        public Builder() {
        }

        public Builder(final Car car) {
            modelName = car.getModelName();
            wheelCount = car.getWheelCount();
        }

        public ImmutableCar build() {
            return new ImmutableCar(wheelCount, modelName);
        }

        @Override
        public String getModelName() {
            return modelName;
        }

        @Override
        public int getWheelCount() {
            return wheelCount;
        }

        public void setModelName(final String modelName) {
            this.modelName = modelName;
        }

        public void setWheelCount(final int wheelCount) {
            this.wheelCount = wheelCount;
        }
    }

    private final String modelName;
    private final int wheelCount;

    public ImmutableCar(final int wheelCount, final String modelName) {
        this.wheelCount = wheelCount;
        this.modelName = modelName;
    }

    @Override
    public String getModelName() {
        return modelName;
    }

    @Override
    public int getWheelCount() {
        return wheelCount;
    }

}
4

5 に答える 5

3

Googleインターフェイスの代わりに抽象基本クラスに基づく場合を除いて、これを行うAutoValueと呼ばれるツールがあります。

import com.google.auto.value.AutoValue;

class Example {
  @AutoValue
  abstract static class Animal {
    static Builder builder() {
      return new AutoValue_Example_Animal.Builder();
    }

    abstract String name();
    abstract int numberOfLegs();

    @AutoValue.Builder
    abstract static class Builder {
      abstract Builder name(String s);
      abstract Builder numberOfLegs(int n);
      abstract Animal build();
    }
  }
}

もう 1 つの同様のツールはImmutablesです。インターフェイスを使用し、不変の実装とビルダーを生成するため、これはおそらく質問に近いものです。

于 2015-07-02T09:59:39.187 に答える
2

Lombokでは、次のようなコードを使用できます。

@lombok.Data
@lombok.Builder
public class ImmutableCar implements Car {
    private final @lombok.NonNull String modelName;
    private final @lombok.NonNull int wheelCount;
}

ロンボク アノテーションはコンパイル時に処理され (JSR-269)、完全なクラスが生成されます。Maven プラグインを介して「delomboking」することで、生成されたコードを確認することもできます。

于 2015-07-02T09:20:12.090 に答える
1

Eclipseプラグインhttps://github.com/karajdaar/templatorを作成しました。

Freemarkerテンプレートに基づいてコードを生成します。Freemarkerテンプレートのコンテキストは、名前付きクラスとその情報への完全なアクセスを可能にするICompilationUnitです。これを使用して、NoSQLデータベース、ジャージクライアント、テストなどのDAOを生成しています。

ここで必要なことは簡単にできると思います。

于 2013-03-21T16:44:12.547 に答える
1

Eclipse Model2Text プロジェクトとそのサブプロジェクト、特にAcceleoXpandをチェックしてください。通常、EMF モデル用の EMF ベースの Java コードを生成するために使用されますが、単純な POJO を生成するためにも使用できます。

ただし、この機能はすぐに使えるわけではありません。独自のコード ジェネレーターとテンプレートを作成する必要があります。Accelelo チュートリアルを参照してください。

編集:

もう 1 つのアイデア - 1 日かかるほど単純なアイデア

VelocityFreemarkerまたは同様のテンプレート ライブラリ (通常は html 生成に使用されます) を使用できます。ただし、.txt ファイルや .xml ファイルなどのどこかにモデルを作成する必要があります。これは Velocity コード生成に関するチュートリアルです。

于 2013-02-06T10:58:23.760 に答える