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

输入示例:

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

}

最佳答案

不可变(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();

07-24 09:45
查看更多