java - 自动生成 Java 接口(interface)的不可变类和匹配的构建器类

标签 java design-patterns immutability builder-pattern

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

示例输入:

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

}

最佳答案

Immutables ( http://immutables.github.io ) 注释处理器完全符合您的需求。它功能齐全且可自定义(您知道所有那些 set vs with vs no-prefix wars,使用你喜欢的任何东西)。它可以使用接口(interface)、抽象类、注释的构建器生成不可变的实现。此外,它还可以生成构建器来调用静态工厂方法或 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();

关于java - 自动生成 Java 接口(interface)的不可变类和匹配的构建器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14725863/

相关文章:

java - 设计模式与EffectiveJava

groovy - 有没有办法让 @Builder 注释适用于不可变类?

Python 动态子集的高效查找结构?

C++ 到 F# 的平滑转换

java - 由于 Linux 中不同的挂载卷,文件移动抛出 IOException

java - 我必须在应用程序退出时手动关闭 Executor 吗?

java - 如何在 Install4j 中将 JCE 添加到 JRE 包

java - 如何使用抽象类来简化 MVC 框架中的模型创建?

c++ - "master copies"子类列表,寻找更好的设计

java - 如何将 SQLite DB 从手持设备转移到可穿戴设备?