自动生成不可变类和匹配 Java 接口的构建器类

bef*_*ore 5 java design-patterns immutability builder-pattern

Java 存在哪些工具或库可以interface仅使用访问器方法定义并自动生成不可变的对象类以及用于增量构建新实例或通过创建新实例来更改现有实例的“构建器”类?

输入示例:

public interface Car {
    String getModelName();
    int getWheelCount();
}
Run Code Online (Sandbox Code Playgroud)

输出示例:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Iev*_*ash 3

Immutables ( http://immutables.github.io ) 注释处理器完全满足您的需求。它功能齐全并且非常可定制(您知道所有这些setwith无前缀战争, - 使用您喜欢的任何内容)。它可以使用接口、抽象类、注释的构建器生成不可变的实现。此外,它还可以生成构建器来调用静态工厂方法或 POJO 构造函数以及许多其他东西。

@Value.Immutable
public interface ValueObject {
  String name();
  List<Integer> counts();
  Optional<String> description();
}

// Compile using annotation processor and use it like this
ValueObject valueObject =
   ImmutableValueObject.builder()
      .name("My value")
      .addCounts(1)
      .addCounts(2)
      .build();
Run Code Online (Sandbox Code Playgroud)