对于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)注释处理器完全可以满足您的需求。它功能齐全且非常可定制(您知道所有set
与with
与无前缀的战争,请使用您喜欢的任何方式)。它可以使用接口,抽象类,注释的生成器生成不可变的实现。此外,它可以生成生成器以调用静态工厂方法或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();